tfe Homepage

14/11/2008

Regex recursive php

Dans certains cas bien concrets il est très utile de faire appel à  la récursivité dans les expressions régulières.
Un exemple des plus  courants et la vérification de parenthèses: une parenthèse ouvrant doit trouver une parenthèse fermante.

Pour résoudre ce type de probleme,une expression reguliere classique est impossible en php (en Perl il serait possible d'imbriquer du code dans la regex pour satisfaire nos besoins, mais c'est un autre debat).
 

Expression reguliere recursive en PHP (?R)

Pour faire bref et concis, voici un exemple de regex classique verifiant 1 mot englobé dans une parenthese:

$regex= "/([^()]*)/";


Explication de l'expression reguliere:
Nous avons tout d'abord:

 

  • (  parenthese ouvrante
  • [^()]*   lots de caractere different des parenthese ouvrantes et fermantes
  • ) parenthese fermante


Cette expression reguliere marchera parfaitement pour des chaines du type "(mon mot)" , ou bien la chaine "()".
Le probleme est que nous devons permettre egalement des mots contenants eux memes des parentheses, et c'est le  ou ça se complique.

La recursivite d'une expression reguliere en PHP est introduite par l'element (?R). Cet element sera alors remplace par l'ensemble de l'expression reguliere.

 

 

$regex="/((?:[^()]*|(?R)))/";


Explication de l'expression reguliere:

 

 

  • ( parenthese ouvrante
  • (?: debut de parenthese pour grouper des elements
  • [^()]*|(?R) on permets un mot sans parentheses ou bien une liste de mots entre parentheses valides (recursivite)
  • ) Fin de groupe
  • ) fin de parenthese

Cette expression reguliere, un peu plus elaboree permettra de verifier des listes de mots du type "(mon (mot))"  ou bien "((mon ) mot)".

Plus d'informations et d'exemples sur http://www.skdevelopment.com/php-regular-expressions.php