Problème
Lorsque l’on parse des fichiers, surtout les fichiers HTML, on a parfois besoin d’extraire un texte compris entre deux balises. Voici donc un moyen d’y parvenir avec les expressions régulières.
Considérations techniques
Je parlerais ici des expressions régulières perl (et par extension : grep -P et preg_* de php).
Par défaut, un /.*/
ou toute autre expression sera « gourmand » : ça matche tant que ça peut encore matcher. Par exemple, /a*/
appliqué à la chaîne "aaa"
va matcher "aaa"
, et non pas ""
.
Dans mon cas pratique, j’ai une balise <td id="identifier">
et j’en cherche le contenu. Donc si la regexp utilisée est /<td id="identifier">(.*)<\/td>/
alors je vais matcher ce qu’il y a entre mon td ouvrant, et le dernier td fermant.
La solution
La solution consiste à dire au moteur d’expression régulière de prendre le moins possible, et ça se code comme suit : /<td id="identifier">(.*?)<\/td>/
.
Bibliographie : http://social.msdn.microsoft.com/Forums/en-US/regexp/thread/ab975ba5-31dd-4e6d-b72f-5cd6bf374b02 (et oui, parfois on trouve des choses utiles sur les forums de microsoft).