Regex recursive en PHP
Les REGEX perl ne permettent pas de gérer la récursivité, c'est-à-dire les patterns imbriqués les uns dans les autres sur une profondeur variable.
Pourtant ce type de traitement est très utile pour faire vérifier la syntaxe ou pour extraire certaines informations avec un pattern (je pense par exemple au parsage du BBcode sur les forums).
Certains moteurs d'expression régulière comme celui de .NET gèrent la récursion à l'aide d'automates qui fonctionnent avec des compteurs, dans .NET ça s'appelle balancing group, mais ça ne fait pas partie du standard PCRE, c'est un ajout de microsoft.
En PHP, il y a 2 solutions pour traiter ce genre de problème :
- Écrire un algorithme simple qui scanne la chaine à analyser caractère par caractère
- Utiliser un masque récursif (recursive pattern), une fonctionnalité expérimentale implémentée par les expressions Perl (et aussi PCRE) qui sert à gérer des patterns sur plusieurs niveaux d'imbrication. Cette fonction s'utilise avec ce "marqueur" :
(?R)
Après avoir lu réafficher une colonne masquée dans excel vous en saurez d'avantage sur ce sujet.
Le principe du masque récursif est un peu similaire à au fonctionnement des références arrière ((?1)
, (?2)
...), qui permettent de désigner un match "dynamique" (c'est-à-dire à une paire de parenthèses capturantes) dans le pattern, sauf que ça fonctionne sur un nombre de niveaux indéterminé.
Plus d'infos sur la documentation PHP : http://php.net/manual/en/regexp.reference.recursive.php.
Découvrez ce tutoriel photoshop : fumée & tasse de café à lire tout de suite !