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
Il n'y a donc absolument aucun moyen de dire « correspond au troisième
 » ?
 – 
clops
31 oct. 2009 à 04:26
A propos de votre mise à jour : presque :) il va au tout dernier /div qu'il voit dans toute la chaîne, alors que j'ai besoin qu'il s'arrête à la troisième correspondance.
 – 
clops
31 oct. 2009 à 04:32
Soupir, je ne suis pas sûr de pouvoir le faire dans les RE. Vous avez vraiment besoin de quelque chose comme XPath de Grok ou le DOM ou .. une sorte d'analyseur, il y en a des millions. Quoi qu'il en soit, regardez aussi la syntaxe RE pour (pattern){m,n} qui trouvera un nombre spécifique de correspondances, et (pattern){m,n}? qui est la version non gourmande.
 – 
DigitalRoss
31 oct. 2009 à 04:39

Vous seriez bien mieux servi par quelque chose comme un analyseur XML/HTML. Voir ici.

5
Community 23 mai 2017 à 15:04
Ouais, devrait certainement utiliser un analyseur au lieu d'une expression régulière pour cela
 – 
user9903
31 oct. 2009 à 05:38

Vous pouvez utiliser les "Axis specifiers" et "fonctions d'ensemble de nœuds"

0
Gökhan Ercan 31 oct. 2009 à 05:34