Bienvenue sur le blog d'un développeur web : Actualités du monde informatique et scientifique, morceaux de programmations et diverses informations intéréssantes.

PHP : Recuperer les balises images d'un document (une page) HTML

Posté par : Neg le : 2012-01-31 22:07:12



Comment faire pour extraire les images utilisés dans un document HTML ? On peut vouloir faire ça pour plusieurs raisons, afficher l’aperçu d'une page web via la première image que l'on trouve dedans par exemple.

Pour cela, quelque fonctions PHP et l'utilisation d'une expression régulière (qui n'est pas de moi dans le code qui suit) pour extraire le contenus "href" des balises image trouvés sont nécessaires.

Je propose ci-dessous un code commenté permettant de le faire, il fonctionne correctement pour une utilisation générale, pour les cas spéciaux je vous laisse le perfectionner.

Le code est exactement celui de cette page de démonstration qui affiche le chemin de l'image (tel que récupéré dans le "href" des balise images) ainsi que l'image traitées. L'url de la page sur laquelle on veut travailler et à passé via un formulaire simple.


<?php
if (isset($_GET["url"])) {
    //on veut recuperer le chemin, et la page
    //on sépare donc les parties delimité par des /
    $chemin_ex = explode("/", $_GET["url"]);
    //on recupere le nombre de parties séparés
    $nb = count($chemin_ex);
    //si nb=1 il n'yavait pas de séparateur /
    if ($nb == 1) {
        //le chemin est donc l'url complète.
        $chemin = $_GET["url"];
        $page = '';
    } else {
        //le chemin correspond à l'url complete moins /dernier element, la page au dernier element
        $page = $chemin_ex[$nb - 1];
        $chemin_ex[$nb - 1] = '';
        $chemin = implode("/", $chemin_ex);
    }
    //on récupère le html de la page que l'on veut avec file_get_contents()
    $html = file_get_contents($chemin . $page);
    //l'expression régulière permettant de trouver les balise images
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/Ui', $html, $matches);
    //pour chacuns des element trouvés
    for ($i = 0; $i < $output; $i++) {
        //on affiche le contenus de la balise src.
        echo $matches[1][$i] . '';
        //et on affiche l'image correspondante.
        //si ca commence pat http on affiche directement
        if (substr($matches[1][$i], 0, 7) == 'http://') {
            echo '<img src="' . $matches[1][$i] . '">';
        } else {
            //si l'image commence par / on doit supprimer le premier repertoire du chemin
            if (substr($matches[1][$i], 0, 1) == '/') {
                $image_tab = explode('/', $matches[1][$i]);
                $image_tab[0]='';
                $image_tab[1]='';
                $image=implode("/", $image_tab);
            } else {
                //sinon on la garde telle quelle et on rajoute le chemin general du site recherché
                $image=$matches[1][$i];
            }
            echo '<img src="' . $chemin . $image . '">';
        }
    }
} else {
    //par defaut remplir le formulaire avec l'url du blog
    $_GET["url"] = 'http://www.chezneg.fr/leblog/chezneg-leblog.php';
}
?>

<form method="get">
    <label>URL dont je veux afficher les images : </label><input type="text" name="url" value="<?php echo $_GET["url"] ?>"/>
    <input type="submit" value="OK" />
</form>
 

lien direct : http://www.chezneg.fr/leblog/chezneg-leblog.php?id_art=261&titre=PHP-:-Recuperer-les-balises-images-d'un-document-(une-page)-HTML
tags : Informatique (67), php (20), image (3), code (1),


J'aime, 3 personnes aiment çaCommentaire(s)(0)

PHP : faire un lecteur RSS grâce à simplexml_load_file

Posté par : Neg le : 2011-10-17 11:51:29



Depuis la version 5 de php, parser un fichier xml est très simple grâçe à la fonction simplexml_load_file() qui s'occupe de tout. On peut ainsi facilement afficher une liste de liens vers le site que l'on veut pour peu qu'il possède un flux RSS.

le (très) court code ci dessous : (le résultat ici)


//on charge le flux dont on passe l'adresse en paramètre de la fonction simplexml_load_file
$monflux = simplexml_load_file('http://cool-videos.fr/coolvideos.xml');
On peut ensuite naviguer dedans (en connaissant sa structure)
foreach ($monflux->channel->item as $item)
{
on affiche le lien et le titre de chaque éléments item
echo '‹a target="_blank" href="'.$item->link.'"›'.$item->title.'‹/a›';
}


il est aussi possible d’utiliser le language XPath pour naviguer dans le fichier XML, et obtenir le même résultat de cette façon :


$monflux = simplexml_load_file('http://cool-videos.fr/coolvideos.xml');
// xpath('//item') va récupérer tous les éléments item ou qu'ils soient
foreach($monflux->xpath('//item') as $item)
{
$content.='‹a target="_blank" href="'.$item->link.'"›'.$item->title.'‹/a›';
}


lien direct : http://www.chezneg.fr/leblog/chezneg-leblog.php?id_art=260&titre=PHP-:-faire-un-lecteur-RSS-grâce-à-simplexml_load_file
tags : Informatique (67), rss (3), php (20), XML (4),


J'aime, 2 personnes aiment çaCommentaire(s)(0)

Regarder la TV devant Internet (et inversement)

Posté par : Neg le : 2011-10-04 11:50:43



Les usages de la télévision et d'internet sont liés, ce n'est pas un scoop mais je m'en rend bien compte aujourd’hui via une preuve par l'expérience. Hier était diffusé sur m6 le deuxième volet du film sur Mesrine.

Ayant fait un article Mesrine de la réalité à la fiction (Photos) fin 2008, une des images présentés apparait actuellement en 2ème position pour la recherche "mesrine mort" dans Google images.

Et Bam, ce blog (rarement mis a jour) qui reçoit habituellement entre 100 et 200 visiteurs/jours à vu ses visites passer a 700 l'instant d'une soirée. J'avais déjà remarqué l'effet la semaine dernière lors de la diffusion du premier volet mais a bien moindre échelle.

Déduction de comptoir : La télé propose des sujets, internet permet d'approfondir. (bien que dans le cas de mon article il s'agisse juste de 5 photos !)

lien direct : http://www.chezneg.fr/leblog/chezneg-leblog.php?id_art=259&titre=Regarder-la-TV-devant-Internet-(et-inversement)
tags : internet (34), Google (8), mesrine (2), tv (1), statistiques (1),


J'aime, 2 personnes aiment çaCommentaire(s)(0)

Albert Dupontel et Benoit Poelvoorde en punks pour le film "le grand soir"

Posté par : Neg le : 2011-07-29 11:30:36



Juste une image qui annonce déjà du lourd, avec Dupontel et Poelvoorde en mode Punk accompagné ici de Didier Wampas. Elle provient du tournage du film "Le grand soir" qui à lieu cet été.



Plus d'informations : ici, et source de la photo

lien direct : http://www.chezneg.fr/leblog/chezneg-leblog.php?id_art=258&titre=Albert-Dupontel-et-Benoit-Poelvoorde-en-punks-pour-le-film-"le-grand-soir"
tags : film (3), wampas (2), punk (3), poelvoorde (1), dupontel (1),


J'aime, 7 personnes aiment çaCommentaire(s)(0)

Editer un fichier de constantes php via un formulaire.

Posté par : Neg le : 2011-07-17 16:47:47



Prenons un cas concret d'un site multi-langues, ou les textes pour chacune des langues sont gérés par un fichier de constantes. Exemple : lang_fr.php, lang_uk.php... contenant :

lang_fr.php


//GENERAL
define('ERREUR_GENERALE','Une erreur est survenue ! ');
define('BONJOUR' , 'Bonjour');
define('DECONNEXION' , 'Déconnexion');
define('URL_INVALIDE', 'url invalide !');
define('PAGE_INACCESSIBLE', 'page inaccessible!');
define('PROFIL_INACCESSIBLE', 'profil inaccessible!');
...


Nos fichiers correspondant pour les autres langues contiennent exactement la même chose, c'est-à-dire qu'ils ne sont pas encore traduit. Comment mettre en place un système d'administration permettant de les traduire ? Cela permettra ainsi à une personne extérieur (le traducteur) de gérer ces modification sans avoir à allez directement dans le code du fichier php, et sans voir le nom des constantes qui ne le concerne pas.

Ce que nous allons faire consiste donc à lire notre fichier de constantes, faire les traitements pour ne récupérer que le texte des constantes, et par la même occasion les commentaires qui permettrons de se repérer. Ensuite nous affichons un formulaire pour chacune des lignes et un bouton "submit" permettant de les modifier. Voici les 2 fonctions permettant de mettre ce système en place. Commentés comme il se doit.

Tout d'abord la fonction lisant notre fichier (dont le nom sera passé en paramètre), et pour chacune des lignes, créant le formulaire de modification :


function formTraduction($langue='lang_fr')
{
$content='';
//on ouvre le fichier
$monfichier = fopen($langue.'.php', 'r+');
$i=0;
//Pour chacune des ligne parcourus
while($ligne = fgets($monfichier))
{
//suppression des espaces inutiles au cas ou
$ligne=trim($ligne);
//si la ligne n'est pas l'ouverture/fermeture des balises php, ou vide :
if($ligne!='<?php' && $ligne!='?>' && $ligne!='')
{
//on vérifie les 2 premiers caractères
$debut=substr($ligne, 0, 2);
if($debut=='//')
{
//si c'est un commentaire on l'affiche sous forme de titre
$ligne=str_replace('//', '', $ligne);
$content.='<h2>'.$ligne.'</h2>';
}
else
{
//sinon on traite notre ligne par quelque petits bricolages pour ne récupérer que le contenu texte de la constante et pas son nom
$tabligne=explode(',', $ligne, 2);
$tabligne[1]=trim($tabligne[1]);
$tabligne[1]=substr($tabligne[1], 1);
$tabligne[1]=substr($tabligne[1], 0, -3);
$tabligne[1]=stripslashes($tabligne[1]);

//on stoque aussi le nom de la constante

$tabligne[0]=trim($tabligne[0]);
$tabligne[0]=substr($tabligne[0], 8);
$tabligne[0]=trim($tabligne[0]);
$tabligne[0]=substr($tabligne[0], 0, -1);
//on met en place le formulaire permettant de modifier la ligne, ils nous faut garder en champs caché le numéro de la ligne ainsi que le nom de la constante et bien sur celui du fichier
$content.='<form class="trad" action="" method="post">';
$content.='<input type="text" name="texte" value="'.$tabligne[1].'">';
$content.='<input type="hidden" name="langue" value="'.$langue.'">';
$content.='<input type="hidden" name="ligne" value="'.$i.'"&>';
$content.='<input type="hidden" name="nom" value="'.$tabligne[0].'">';
$content.='<input type="submit" name="edittext" value="Ok"&>';
$content.='</form>';
}
}
$i++;
}
//on ferme le fichier
fclose($monfichier);
return $content;
}


maintenant que nos formulaire sont prêt, voici la fonction permettant de le traiter, pour cela nous allons créez un fichier temporaire, copiant chaque ligne de l'autre fichier. Excepté celle que l'on veux modifier. On supprime ensuite l'ancien fichier pour le remplacer par le temporaire que l'on renomme. Le code :


//on attend les données posté par notre formulaire mis en place ci-dessus.
function editLangue($data)
{
extract($data);
$monfichier = fopen($langue.'.php', 'r+');
$monfichier_temp = fopen(temp_'.$langue.'.php', 'a+');
$i=0;
while($parcours = fgets($monfichier))
{
if($i==($ligne))
{
$texte=str_replace("\n", "", $texte);
//si on est sur notre ligne à modifier, on reconstruit la ligne avec le "define" le nom de la constante et son texte.
$newligne="define('".$nom."' , '".$texte."');"."\n";
fputs($monfichier_temp, $newligne);
}
else
{
//sinon on copie simplement la même ligne dans le nouveau fichier
fputs($monfichier_temp, $parcours);
}
$i++;
}
fclose($monfichier);
fclose($monfichier_temp);
unlink($langue.'.php');
rename(temp_'.$langue.'.php', $langue.'.php');
}


voila, avec ces 2 fonctions, il suffit de faire quelque chose de ce type pour pouvoir traduite la langue via une administration basique :


if(isset($_POST["edittext"]))
{
editLangue($_POST);
}
//on appelle la fonction avec le nom du fichier voulu en paramètre
echo formTraduction('lang_fr');


c'est fonctionnel, mais je ne sais pas si les explications sont bien claires... En espérant une nouvelle fois que ça pourra aider certaines personnes.

avec un peu d'astuce et de mise en page on arrive à un aperçu de ce type :

lien direct : http://www.chezneg.fr/leblog/chezneg-leblog.php?id_art=257&titre=Editer-un-fichier-de-constantes-php-via-un-formulaire.
tags : Informatique (67), php (20), editer (1), fichier (1), constante (1), traduction (1), administration (1),


J'aime, 5 personnes aiment çaCommentaire(s)(0)

Page Suivante

propulsé par Neg