Les expressions régulières permettent de manipuler des chaînes de caractères. Ce système est emprunté au système POSIX (un système d'exploitation). De nombreux scripts sous UNIX les utilisent (notamment Perl).

Il s'agit d'un système fort ingénieux, et très puissant, permettant de retrouver un mot, une phrase, ou n'importe quel groupe de caractères, dans un texte suivant le modèle que l'on a défini.

1- Syntaxe d'une expression régulière

Une expression régulière est une chaîne de caractères contenant des caractères spéciaux et des caractères standards. Il existe une grande variété de caractères spéciaux, le plus facile est de les voir au fur et à mesure à l'aide d'exemples.

J'ai appris les expressions régulières à l'aide de cet article et je vais donc utiliser les mêmes exemples.

Début & fin

Les symboles ^ et $ indiquent le début ou la fin d'une chaîne, afin de la délimiter.

"^debut": chaine qui commence par "debut"
"fin$": chaine qui se termine par "fin"
"^chaine$": chaine qui commence et se termine par "chaine"
"abc": chaine contenant la chaine "abc"

Répétition

Les symboles *, + et ?, respectivement "zero ou plusieurs", "un ou plusieurs", "un ou aucun", permettent de donner une notion de nombre.

"abc+": chaine qui contient "ab" suivie de un ou plusieurs "c" ("abc", "abcc" etc..)
"abc*": chaine qui contient "ab" suivie de zero ou plusieurs "c" ("ab", "abc" etc..)
"abc?": chaine qui contient "ab" suivie de zero ou un "c" ("ab" ou "abc")
"^abc+": chaine qui commence par "ab" suivie de un ou plusieurs "c" ("abc", "abcc" etc..)

Nombre de fois

Les accolades {X,Y} permettent de donner des limites de nombre.

"abc{2}": chaine qui contient "ab" suivie de deux "c" ("abcc")
"abc{2,}": chaine qui contient "ab" suivie de deux "c" ou plus ("abcc" etc..)
"abc{2,4}": chaine qui contient "ab" suivie 2, 3 ou 4 "c" ("abcc" .. "abcccc")

NB : le premier nombre de la limite ("{0,2}", et non pas "{,2}") est obligatoire. Les symboles vus précédemment ("*", "+", and "?") sont équivalents à "{0,}", "{1,}", et "{0,1}".

Séquence

Les parenthèses ( ) permettent de représenter une séquence de caractères.

"a(bc)*": chaîne qui contient "a" suivie de zero "bc" ou plus

Opérateur OU

La barre verticale | se comporte en tant qu'opérateur OU.

"un|le": chaîne qui contient "un" ou "le"
"(un|le) chien": chaîne qui contient "un chien" ou "le chien"
"(a|b)*": chaîne qui contient une suite de "a" ou de "b"

N'importe quel

Le point . indique n'importe quel caractère (une fois).

"^.{3}$": chaîne qui contient 3 caractères

Liste

Les crochets [ ] définissent une liste de caractères autorisés (ou interdits). Le signe - permet, quant à lui, de définir un intervalle. Le caractère ^ après le premier crochet indique une interdiction.

"[abc]": chaîne qui contient un "a", un "b", ou un "c"
"[a-z]": chaîne qui contient un caractère compris entre "a" et "z"
"[^a-zA-Z]": chaîne qui ne commence pas par une lettre

Pour rechercher un caractère faisant partie des caractères spéciaux, il suffit de le faire précéder d'un antislash (un antislash doit donc être doublé), SAUF entre crochets. En effet, dans les crochets, chaque caractère représente ce qu'il est. Pour représenter un ] il faut le mettre en premier (ou après un ^ si c'est une interdiction), un - se met en premier ou en dernier.

"[\+?{}.]": chaîne qui contient un de ces six caractères
"[]-]": chaîne qui contient le caractère "]" ou le carcatère "-"

2- Les classes de caractères

Il peut également être utile de vérifier si une chaîne contient des caractères d'un certain type (numérique, alphanumérique, ...) sans avoir à les énumérer. Pour cela, les expressions régulières définissent des classes de caractères, dont la syntaxe est : [:classe:]
Les classes de caractères sont celles définies par UNIX.

En voici quelques-unes :

Classes de caractères
[:alnum:]caractère alphanumérique (équivalent à [A-Za-z0-9])
[:alpha:]caractère alphabétique ([A-Za-z])
[:blank:]caractère blanc (espace, tabulation)
[:ctrl:]caractère de contrôle (les premiers du code ASCII)
[:digit:]chiffre ([0-9])
[:graph:]caractère d'imprimerie
[:print:]caractère imprimable (tout sauf les caractères de contrôle)
[:punct:]caractère de ponctuation
[:space:]caractère d'espacement
[:upper:]caractère majuscule
[:xdigit:]caractère hexadécimal

Exemples :

"^[:alnum:]+$": chaîne composée d'un (ou plusieurs) caractère(s) alphanumérique(s)
"[:punct:]|[:space:]": chaîne contenant un caractère de ponctuation ou un caractère d'espacement
"^[:digit:]+$": nombre

3- Les fonctions PHP

Il existe plusieurs fonctions PHP, permettant de manipuler des chaînes de caractères à l'aide d' expressions régulières.

NB : Vous pouvez télécharger les exemples suivants en archive zip.

Les fonctions ereg() et eregi()

Expression rationnelle standard.

booleen ereg(chaine expression, chaine texte[, tableau occurences])

Permet d'évaluer le texte passé en paramètre, à partir de l'expression régulière expression. Les occurences trouvées sont optionnellement stockées dans le tableau passé en paramètre. La fonction retourne vrai si une occurence est trouvée, et faux si rien n'est trouvé.

La fonction eregi() est identique à la fonction ereg(), mais ne tient pas compte de la casse (de la différence entre majuscules et minuscules).

  1. <?php
  2.  
  3. $fp = fopen("http://www.phpfrance.com/index.php", "r"); // lecture de la page
  4. while (!feof($fp)) { //on parcoure toutes les lignes
  5. $page .= fgets($fp, 4096); // lecture du contenu de la ligne
  6. }
  7. $titre = eregi("<title>(.*)</title>", $page, $regs); //on isole le titre
  8. // Le titre commence par <title>, puis contient n'importe quelle chaine, et se termine par </title>
  9. echo '<p>Titre de la page : '. $regs[1] . '</p>'; // on retourne la premiere occurence trouvée
  10. // Les occurences se trouvent entre parenthèses
  11. // $regs[0] renvoie toute la chaine
  12. fclose($fp);
  13.  
  14. ?>

Les fonctions ereg_replace() et eregi_replace()

chaine ereg_replace(chaine expr, chaine remplacement, chaine texte)

Retourne la chaîne texte passée en paramètre, modifiée à l'aide de l'expression régulière et de la chaîne de remplacement.

  1. <?php
  2.  
  3. // ajoute <br /> à la fin du texte
  4. $ligne1 = 'premiere ligne';
  5. $ligne2 = 'deuxieme ligne';
  6. echo '<p>' . ereg_replace("$", "<br />", $ligne1) . $ligne2 . '</p>';
  7.  
  8. ?>

La fonction split()

tableau split (chaine expression, chaine texte [, entier limite])

Retourne un tableau à partir d'une chaîne et d'une expression régulière. La limite, optionnelle, permet de limiter la taille du tableau retourné. Dans ce cas, le dernier élément du tableau contient le reste de la chaîne. Si une erreur se produit, split retourne la valeur 0.

  1. <?php
  2.  
  3. // découpe une phrase en un tableau de mots
  4. // on utilise split au cas ou plusieurs espaces séparent les mots
  5. $phrase = "Ceci est une phrase avec trois espaces ici";
  6. $tableau_mots = split(" +", trim($phrase)); // un espace ou plus
  7. print_r($tableau_mots);
  8.  
  9. ?>

La fonction sql_regcase()

chaine sql_regcase (chaine texte)

Retourne une expression régulière qui représente la chaîne passée en paramètre sans tenir compte de la case. Chaque caractère de la chaîne est representé entre crochets, avec deux caractères à l'intérieur, un en majuscule et l'autre en minuscule, ou, le cas échéant, deux fois le même caractère.

Aucune explication ne vaut un exemple ;)

  1. <?php
  2.  
  3. echo sql_regcase('un test');
  4. // affiche [Uu][Nn][ ][Tt][Ee][Ss][Tt]
  5.  
  6. ?>

Cette fonction permet de générer une chaîne non sensible à la casse, pour les expressions régulières dans les bases de données par exemple. Dans MySQL, lorsque vous utilisez la fonction REGEXP (au lieu de LIKE), la recherche est sensible à la casse. La solution est donc de générer une chaîne non sensible à la casse à l'aide de sql_regcase.

  1. <?php
  2.  
  3. $motclef = sql_regcase("motclef");
  4.  
  5. // selectionne tous les enregistrements de la table table, contenant le MOT motclef
  6. $sql = "SELECT * from table WHERE champ REGEXP '[[:<:]]" . $motclef . "[[:>:]]'";
  7.  
  8. ?>

Les PCRE

Les PCRE sont des expressions rationnelles compatibles Perl, avec par exemple la fonction preg_replace() plus rapide et plus souple que la fonction ereg_replace().

Leur syntaxe est un peu différente des fonctions citées plus haut, mais reste similaire.

Nous présenterons les PCRE dans un nouveau tutorial, mais en attendant voici un petit exemple :

  1. <?php
  2.  
  3. // ajoute <br /> à la fin du texte
  4. // et transforme les 2 premieres lettres du texte en majuscules
  5. $ligne1 = 'premiere ligne';
  6. $ligne2 = 'deuxieme ligne';
  7. // la fonction preg accepte les tableaux, pour effectuer plusieurs operations
  8. $cherche = array("/$/", "/^(.{2})/e"); // l'option e permet d'utiliser une fonction
  9. // php pour le remplacement
  10. $remplace = array("<br />", "strtoupper('\\1')");
  11. echo '<p>' . preg_replace($cherche, $remplace, $ligne1);
  12. echo preg_replace($cherche, $remplace, $ligne2) . '</p>';
  13.  
  14. ?>

4- Conclusion

Les expressions régulières sont difficiles à prendre en main au début, mais sont vraiment très utiles. J'espère que ce tutorial vous aidera. D'autres tutoriaux suivront, dont notamment un sur l'utilisation des PCRE.

Télécharger les exemples en archive zip.

En savoir plus : Vous pouvez également consulter l'excellent tutorial de Naholyr, au format PDF.