Petite expression rationnelle
(?:`.*?[^\\]`)|[^"'`])+?)\#)@
Ceci est une petite expression rationnelle PERL que j'ai construit hier avec Quentin alors qu'on travaillait sur une bibliothèque SQL pour notre moteur web. Nous devions matcher tout bloc de code compris entre les tokens '#' et '#', mais ne pas compter les '#' qui apparaitraient dans des strings (et ce a l'intérieur ou a l'extérieur des blocs '# ... #'), sachant qu'une string est entourée de quotes, double-quotes ou backquotes, qui peuvent contenir ces mêmes caractères backslashés.
Par exemple, ceci devait matcher :
et renvoyer :
En effet, le diese du milieu est dans une string, qui va de "pomme" à "rouge" , et ne doit pas être compté comme caractère de fin de bloc.
Voici le code php qui nous a permis de créer cette expression :
- $spl = "(?:'.*?[^\\\\]')"; // string between simple quotes
- $dbl = '(?:".*?[^\\\\]")'; // string between double quotes
- $bck = '(?:`.*?[^\\\\]`)'; // string between back quotes
- $string = $spl.'|'.$dbl.'|'.$bck; // a string block
- $diese = '\#((?:'.$string.'|[^"\'`])+?)\#'; // a # ... # block
- preg_match_all('@(?:'.$string.')|(?:'.$diese.')@', $content, $matches, PREG_OFFSET_CAPTURE);
Sympa, non ?
