Probleme de regex...

Eléphant du PHP | 189 Messages

03 nov. 2006, 11:01

Salut a tous,

Voila, je viens vous voir car j'ai un soucis avec des regex..
J'ai ces chaines de caractères à analyser :

Code : Tout sélectionner

<A HREF="http://admin.number.ath.cx/phpmyadmin/" ADD_DATE="1118958246" LAST_VISIT="1161882668" LAST_MODIFIED="1120383862" IMG="image-1.ico" LAST_CHARSET="UTF-8" ID="rdf:#$SQiPW">PhpMyAdmin</A> <A HREF="http://admin.number.ath.cx/phppgadmin/" ADD_DATE="1120428046" LAST_VISIT="1161431888" LAST_MODIFIED="1157624170" LAST_CHARSET="ISO-8859-1" ID="rdf:#$TQiPW">phpPgAdmin</A> <A HREF="http://forum.number.ath.cx/" ADD_DATE="1119275599" LAST_VISIT="1162487291" LAST_MODIFIED="1157624182" IMG="image-2.ico" LAST_CHARSET="ISO-8859-1" ID="rdf:#$QQiPW">Forum "Les projets"</A> <A HREF="http://chat.number.ath.cx/" ADD_DATE="1157623895" LAST_VISIT="1161432158" LAST_MODIFIED="1157624203" LAST_CHARSET="ISO-8859-1" ID="rdf:#$mTXBY1">Chat Irc</A> <A HREF="http://mail.number.ath.cx/squirrelmail/src/login.php" ADD_DATE="1160598304" LAST_VISIT="1161431874" LAST_CHARSET="ISO-8859-1" ID="rdf:#$eTA0q1">SquirrelMail - Accès Messagerie</A>
Et j'aimerais pouvoir en extraire :
Le lien,le nom du lien, et si il existe, le nom de limage..
Sachant qu'il n'y a pas toujours les mêmes paramètres dans la chaine...

J'ai bien essayé avec quelque chose comme ceci :
$Fichier = ereg_replace("<A HREF=\"([^\"]+)\"[^>]+(IMG=\"[^\"]+\"[^>]+)?>([^<]+)</A>",
"Var 1 : \\1<br/>Var 2 : '\\2'<br/>Var 3 : \\3<br/>Var 4 :\\4<br/>",
$var);
Mais cela ne fonctionne que pour les urls et noms des liens..

Merci pour votre aide !!

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

03 nov. 2006, 12:07

Tiens en tatonnant un peu j'ai finalement obtenu ceci qui permet d'extraire les trois éléments : #<A HREF="(.*?)" (?:.*?IMG="(.*?)")?.*?>(.*?)</A>#i

Le jeu c'est d'utiliser des sélecteurs non gourmands (plus faciles à maîtriser, mais un peu consommateurs de ressources je crois), et les parenthèses non capturantes (?: ... ) pour avoir un masque globale optionnel dont on ne veut capturer qu'une partie (le cas de IMG="..."). Mais surtout, surtout : PREG_* et non EREG_* qui de toute façon auraient du disparaître depuis bien longtemps (elles sont très peu performantes, et la syntaxe n'est pas tellement plus simple).
<?php

$texte = preg_replace('#<A HREF="(.*?)" (?:.*?IMG="(.*?)")?.*?>(.*?)</A>#i', 'Titre = $3, Image = $2, Lien = $1', $texte);

echo $texte;

?>
Titre = PhpMyAdmin, Image = image-1.ico, Lien = http://admin.number.ath.cx/phpmyadmin/
Titre = phpPgAdmin, Image = , Lien = http://admin.number.ath.cx/phppgadmin/
Titre = Forum "Les projets", Image = image-2.ico, Lien = http://forum.number.ath.cx/
Titre = Chat Irc, Image = , Lien = http://chat.number.ath.cx/
Titre = SquirrelMail - Accès Messagerie, Image = , Lien = http://mail.number.ath.cx/squirrelmail/src/login.php

Eléphant du PHP | 189 Messages

03 nov. 2006, 12:21

Merci beaucoup..
Je ne connaissais pas le système de parenthèse non capturant..

Aurais-tu un site concernant preg replace ?

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

03 nov. 2006, 16:33