Exemple de problématique: récupérer des tags html valides.
C’est à dire qui commence par un tag (<a>, <u>, <strong>) et qui fini par le bon tag (</a>, </u>, </strong>).
La première solution
La solution la plus évidente donne la regex suivante :
-
<([a-z]+)[^>]*>(.*)<\/([a-z]+)>
Mais cela match des tags invalides:
<a>test</a> => test OK
<a>bla <b>test</b> bla</a> => bla <b>test KO
<a>test</b> => test KO
Deuxième solution: utiliser les substitution group dans la regex
On sait tous utiliser les substitutions group pour faire des remplacements de chaine.
Mais là où ça devient très interessant c’est qu’il est également possible de les utiliser dans la regex elle même !
Nous obtenons cette deuxième expression:
-
<([a-z]+)[^>]*>(.*)<\/\1>
Remarque: la magie opère avec \1 qui match le texte de la 1ere accolade.
<a>test</a> => test OK
<a>bla <b>test</b> bla</a> => bla <b>test</b> bla OK
<a>test</b> => rien OK
Vous pouvez tester en live: http://www.regex101.com/r/zN4yS7