Page 1 sur 1

traitement d'une page de liens

Posté : 22 nov. 2008, 21:00
par pascal2vanves
bonsoir à tous et toutes,

j'ai trouvé un script tout simple et super rapide pour récuperer les adresses d'une page :

Code : Tout sélectionner

<?php $text = implode("",file("pagedeliens.html")); // extraction de l'adresse internet $motif='#<a href="(.*?)"(.*?)>#is'; preg_match_all($motif,$text,$out,PREG_PATTERN_ORDER); foreach ($out[1] as $link) { echo "$link<br />"; } ?>
par contre je n'arrive pas à récuperer les titres de chacun des liens..
je crois que je dois utiliser la fonction strip_tags mais je ne sais pas l'insèrer dans mon script :-(

Exemple de résultat recherché pour le lien <a href="http://www.google.fr">Google</a>
lien du site = 'http://www.google.fr'
nom du site = Google


si quelqu'un a un conseil , ce serait une super aide !!!
merci d'avance

Posté : 22 nov. 2008, 21:53
par Ryle
Il te faut modifier le masque de ton expression régulière pour lui dire ce que tu souhaites récupérer. Actuellement tu récupères ce qui est entre parenthèse, c'est à dire le contenu de l'attribut href, et tout ce qui le suit jusqu'à la fermeture de la balise.
<a href="(.*?)"(.*?)>
Ce que tu veux récupérer en plus, c'est ce qu'il y a après le ">" et avant le "</a>".

Il te suffit donc de modifier le masque, et éventuellement d'aller faire un petit tour du côté des expressions régulières pour comprendre comment elles fonctionnent :)

Posté : 23 nov. 2008, 00:06
par pascal2vanves
merci Ryle pour ta suggestion.
je galère mais j'approche du but...

Code : Tout sélectionner

<?php $text = implode("",file("pagedeliens.html")); // extraction de l'adresse internet $motif='#<a href="(.*?)"(.*?)>#is'; preg_match_all($motif,$text,$out,PREG_PATTERN_ORDER); foreach ($out[1] as $link) { echo "$link<br />"; } //extraction des titres des liens $motif2='#<a[^>]+?>(.*?)</a>#is'; preg_match_all($motif2,$text,$out2,PREG_PATTERN_ORDER); foreach ($out2[0] as $titres) { echo strip_tags($titres); echo "<br />"; } ?>
le résultat est presque là...mais... j'obtiens une série de lignes d'adresses puis, après, une série de lignes de titres...

or, ce que je recherche, c'est de récupérer les couples adresses + titres

je suis toujours preneur d'une amélioration de mon script ;-)

Posté : 23 nov. 2008, 10:23
par Ryle
Il n'est pas nécessaire de doubler le code, il suffit simplement de modifier ton premier masque pour récupérer d'un coup toutes les données dont tu as besoin :)

Comme je te le disais plus haut, actuellement ton masque capture le contenu du href, mais également tout ce qui le suit jusqu'au ">". Dans ton traitement tu ne gères que $out[1] qui correspond à la première parenthèse capturante et tu ignores $out[2] qui contient le reste.

Tu peux donc soit compléter le masque pour ajouter une troisième parenthèse capturante (il te suffit alors de traiter $out[1] et $out[3] pour avoir l'url et le texte du lien) ou même supprimer la 2ème parenthèse vu que tu n'utilises pas ce qu'elle capture, et l'ajouter au niveau du texte du lien. En gros, il faut combiner tes deux motifs pour n'en faire qu'un qui capturera tout ce dont tu as besoin, puis modifier ton foreach pour récupérer les données souhaitées du tableau $out :)

Posté : 23 nov. 2008, 12:48
par chrislabricole
Essaies de le faire toi-même pour t'entrainer, c'est un bon entrainement ça :)

Voici la correction, je me suis entrainé moi aussi :P
<?php
// URL à capturer les liens
$link = 'http://www.phpfrance.com/';

// Renvoi TRUE si le lien existe sur la toile et que la page existe... sinon, FALSE
function url_exists($url){
    $open = @fopen($url, 'r');
    return ($open) ? 1 : 0;
}

// Si l'URL existe
if( url_exists($link) ){
	$file = implode('', file($link, FILE_SKIP_EMPTY_LINES) ); // Prise du contenu et ignore les lignes vides
	
	// extraction de l'adresse internet
	$pattern = '#<a href="(.*?)"(.*?)>(.*?)</a>#is'; // Motif
	preg_match_all($pattern, $file, $out, PREG_PATTERN_ORDER);
	
	
	echo '<h2>Liens de <b>'.$link.'</b> :</h2>'."\r\n";
	$i = 0;
	foreach ($out[3] as $linkText) { // $out[3] = tableau les textes des liens
		$linkText = utf8_encode(strip_tags($linkText)); // encodage en UTF-8 et suppression des tags HTML
		$formatLinkText = (!empty($linkText)) ? $linkText : '<i>N/A</i>'; // Si $linkText = à rien, alors, affichage de de N/A, sinon, affichage du lien...

		echo '<b>'.$formatLinkText.'</b> : '.$out[1][$i].'<br />'."\r\n"; // Affichage :  texte : lien
		$i++; // Incrémentation pour afficher le lien
	}
} else {
	echo 'Page introuvable ou connexion impossible au site <b>'.$link.'</b>...'; // Renvoi d'un message d'erreur
}
?>
;)