Bonjour,
J'ai une regex qui me permet de capturer <include file="%1" cache="%2" /> et c'est tout, pour l'instant elle est limité à ces 2 attributs, file et cache. Voila la chose:
#<(include)(?:(?:\s*(?:(?:file=(\\\\\'|")(.*?)\\2)|(?:cache=(\\\\\'|")(.*?)\\4)))+)\s*/>#s
Une fois que j'ai pu comprendre ça j'ai voulu la modifier pour prendre tous les attributs que j'aurais pu ajouter dans ma balise include. J'ai pas réussi! il est soit trop "gourmand" il prend toutes les balises dans 1 seul résultat, soit sinon il prend carrément rien du tout 
#<(include)(\s*((\w*)=(\\\\\'|")(.*?)\\2)*)*\s*/>#s
cet exemple ne prend que la dernière balise et je voudrais bien savoir pourquoi :
array(7) {
[0]=> string(38) "<include file="stats.tpl" cache="1" />"
[1]=> string(7) "include"
[2]=> string(0) ""
[3]=> string(10) "cache="1" "
[4]=> string(5) "cache"
[5]=> string(1) """
[6]=> string(2) "1""
}
#<(include)(\s*(\w*)="(.*)")*\s*/>#sU
plus permissif, mais donne le même résultat (que le cache="1")
#<(include)((.*)=(.*))*/>#sU
Encore plus permissif, enfin je croyais, mais en fait pas du tout! ça me capture plus rien du tout...
J'utilise mes expressions dans un preg_replace_callback, je ne sais pas si ça a une importance(?)
J'ai eu l'impression qu'une telle capture ne peut pas être récursive, du coup je penche vers une autre solution, analyser le résultat avec une autre recherche : j'ai donc capté le <include blabla /> avec ma 1ère regex, et je tente de capter tous les attributs de cette balise : <include file="stats.tpl" cache="1" />
preg_match_all( '# (\w*)=(\\\\\'|")(.*?)\\2#', $a, $out);
mais ne capture rien du tout non plus
j'ai pourtant l'impression que ça se joue à pas grand chose mais je ne vois pas.
Partager