OVH Cloud OVH Cloud

aide sur une expression reguliere

2 réponses
Avatar
bruno
bonjoiurs, je developpe pour mon action de bts un framwork incluant un
moteur de template.

pour ce moteur de template, j'utilise les regex.

a un moment j'ai une "balise" (\[ *testBDD *; *block *= *li *\]) et je
veut situer son block qui l'entoure (<li> </li> pour cet exemple)

pour ce faire, je faisait :
"<li>.*\[ *testBDD *; *block *= *li *\].*</li>"

mais, au lieur de s'arreter au premier bloc </li> renconté, il allait
plus loin (jusqu'au dernier)

et la... je bloque, j'en suis la :

"<li>(^<li>)*\[ *testBDD *; *block *= *li *\](^</li>)*</li>"

mias ca ne marche pas.

ce que je cherche a faire, c'est lui specifier que je veut "n'importe
quel caracter, tant que ca ne forme pas un <li>"...
mais ... blocage... help please!

on peut resuire mon pb ainsi pour plus de clarté :
"<li>.*balise.*</li>"

2 réponses

Avatar
Marc
bruno wrote:

pour ce moteur de template, j'utilise les regex.



les expressions reguliere sont gourmandes par defaut, c'est
a dire qu'elle vont le plus loins possible quand tu utilises
des caracteres de repétition : + ou *

pour les rendre non gourmandes (greedy) :

* placer un ? juste apres le + ou *,
* utiliser l'option qui va bien apres le séparateur, me souviens
plus de option (voir doc) : ex : '#<li>.*</li>#x' (x est l'option
a trouver)

Avatar
bruno
avec preg_replace (enfin tous les preg), on peut utiliser des options
en fin de ligne, je ne sait pas trop encore comment ca fonctionne, mias
un U par exemple permet de rendre la regex entieremment non greedy :)

http://fr.php.net/manual/fr/reference.pcre.pattern.modifiers.php