geek space web solutions

Utiliser des expressions régulières avec preg_match_all

Dimanche, 22 Août 2010 18:37
php regex matching
Les expressions régulières : c'est tout un art. J'explique ici l'essentiel et comment récupérer le code html contenu entre 2 balises.

Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de trouver les portions de la chaîne correspondant au modèle. Il s'agit d'un système fort ingénieux permettant de retrouver un mot, ou une phrase dans un texte, ressemblant au modèle que l'on a construit...

Vous trouverez une documentation complète en cherchant sur Internet, néanmoins je vais expliquer ici les schémas ou pattern que j'utilise qui permettent de comprendre l'essentiel :

Caractères Explications
^ et $ Les symboles ^ et $ indiquent respectivement le début et la fin d'une chaîne.
*, + et ? respectivement "zero ou plusieurs", "un ou plusieurs", "un ou aucun", permettent de donner une notions de nombre.
[^>]* Tout sauf le caractère >, autrement dit : tout sauf du texte contenant des balises.
L'étoile signifie que le schéma précédent peut se répéter de 0 à plusieurs fois. On peut utiliser à la place de l'étoile un + si on veut que le schéma doit se répéter au moins une fois.
<\/a> Remarquez simplement que l'antislash permet de protéger le caractère qui suit si ce caractère et lui-même un caractère spécial.
\w Tout caractère représentant un mot et incluant un trait de soulignement : "[A-Za-z0-9_]"
. Tout caractère unique, sauf le caractère de nouvelle ligne.
(.|\n)* Tout caractère unique OU caractère de nouvelle ligne se répétant 0 ou plusieurs fois


Exemple 1 :
Vous pouvez utiliser par exmple le pattern suivant :
"!<tr( [^>]+)?>(.*)</tr>!Ui"

Les options :
L'option "U" va chercher à raccourcir au maximum le matching, ca rend le "*" non gourmand, pour éviter de récupérer plusieurs blocs <tr>...</tr>.
L'option "i" pour que ce soit insensible a la casse (un </TR> ne posera pas de problèmes...)


Exemple 2 :
Pour finir voilà le code que j'utilise pour ajouter des balises h2 sur un lien contenu dans une cellule de tableau dont la classe est contentheading sous Joomla en utilisant la fonction preg_match_all :
// Pour les titres des articles par exemple
preg_match_all('/(<td class="contentheading[^.]*" width="100%">)((.|\n)*)(<\/td>)/Ui' , $content_text, $result2);

for($i=0; $i<count($result2[0]); $i++) {

$new_link=$result2[1][$i]."<h2>".$result2[2][$i]."</h2>".$result2[4][$i];

$content_text=str_replace($result2[0][$i], $new_link, $content_text);
}
 

Ajouter un Commentaire


Code de sécurité
Rafraîchir

Sections

Éditeur de fichier XML en ligne


"XML Manager" est un éditeur sécurisé permettant d'administrer en ligne un fichier XML.
Il fournit des fonctions avancées de recadrage et de redimensionnement des images...

Sondages

Pensez-vous que le HTML5 puisse complètement remplacer Flash ?
 
Seriez-vous intéressé par un éditeur d'XML en ligne ?
 

Paypal

paypal

Code du plugin Joomla AutoSEO 1.2 par www.geek-space.fr