Existe-t-il un moyen de dire à preg_match_all d'utiliser la troisième correspondance qu'il trouve en sautant les deux premières ? Par exemple, j'ai le code HTML suivant
<div class="entry">
<div class="text">BlaBlaBla</div>
<div class="date">2009-10-31</div>
</div>
J'ai besoin de preg_match_all pour obtenir le contenu du div le plus à l'extérieur, et ne pas s'arrêter au premier /div qu'il rencontre.
1
clops
31 oct. 2009 à 04:03
3 réponses
Meilleure réponse
C'est la classe de problèmes que les expressions régulières ne peuvent théoriquement pas traiter : les structures définies de manière récursive. Les RE étendus pourraient en quelque sorte le faire, mais (pour mélanger les métaphores), il vaut mieux utiliser un outil différent.
Cela dit, PCRE a spécifiquement une fonction de modèle récursif, la démonstration typique est \((a*|(?R))*\)
qui peut gérer n'importe quelle combinaison de parenthèses équilibrées et de a
. Vous pouvez donc probablement adapter cela, mais vous essayez de faire quelque chose que je n'essaierais pas de faire avec les ER.
Mise à jour : je ne sais pas à quel point cela sera utile, mais :
php > $t = "<div> how <div> now is the time </div> now </div>";
php > preg_match('/<div>(.*|(?R))*<\/div>/',$t,$m); print_r($m);
Array
(
[0] => <div> how <div> now is the time </div> now </div>
[1] =>
)
php >
4
DigitalRoss
31 oct. 2009 à 04:44