Bonjour,
je te conseil d'ajouter un point d'interrogation aprés le * ou le + sur les exemples précédants, soit *? et +?, car + et * sont des quantificateurs gloutons qui chercheront à avoir le plus grande correspondance possible sauf si tu les "dégloutonnes" avec un point d'interrogation. Donc si tu dois matcher ce code html par exemple et que tu n'as pas fait rempart à la gloutonnerie des quantificateur:
<table class="infobox_v2" cellspacing="7"><tr><td>haut les mains</td></tr></table><table class="infobox_v2" cellspacing="7"><tr><td>peau de lapin</td></tr></table>
tu obtiendras comme résultat:
<tr><td>haut les mains</td></tr></table><table class="infobox_v2" cellspacing="7"><tr><td>peau de lapin</td></tr>
qui est la plus grande correspondance possible.
Si dans ta regex tu veux que tous tes quantificateurs se comportent de manière non gloutonne tu peux aussi utiliser le modificateur U (<-- Ungreedy = pas glouton) et ne pas avoir à mettre un point d'interrogation dégloutonnisateur après chacun d'eux (si un jour tu en as plusieurs).
Autre chose, par défaut le "." matche n'importe quel caractère sauf les nouvelles lignes. Pour ça, tu dois utiliser le modificateur s qui permet au point de prendre en compte un passage à la ligne. Sinon si <table et </table> sont sur des lignes différentes, tu ne trouveras rien.
D'où:
preg_match_all('#<table\sclass="infobox_v2"\scellspacing="7">(.*?)</table>#s', $codeSource, $resultat);
ou avec le modificateur U
preg_match_all('#<table\sclass="infobox_v2"\scellspacing="7">(.*)</table>#sU', $codeSource, $resultat);
preg_match_all stocke les résultats dans un tableau de tableaux, resultat[1] doit normalement contenir un tableau avec les correspondances de tes premières (et unique) parenthèses capturantes.
Partager