Les expressions régulières
Par Damien, dimanche 6 mars 2005 à 21:27 :: PHP :: #16 :: rss
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).
<?php } // Le titre commence par <title>, puis contient n'importe quelle chaine, et se termine par </title> // Les occurences se trouvent entre parenthèses // $regs[0] renvoie toute la chaine ?>
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.
<?php // ajoute <br /> à la fin du texte $ligne1 = 'premiere ligne'; $ligne2 = 'deuxieme ligne'; ?>
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.
<?php // découpe une phrase en un tableau de mots // on utilise split au cas ou plusieurs espaces séparent les mots $phrase = "Ceci est une phrase avec trois espaces ici"; ?>
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 ;)
<?php // affiche [Uu][Nn][ ][Tt][Ee][Ss][Tt] ?>
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.
<?php // selectionne tous les enregistrements de la table table, contenant le MOT motclef $sql = "SELECT * from table WHERE champ REGEXP '[[:<:]]" . $motclef . "[[:>:]]'"; ?>
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 :
<?php // ajoute <br /> à la fin du texte // et transforme les 2 premieres lettres du texte en majuscules $ligne1 = 'premiere ligne'; $ligne2 = 'deuxieme ligne'; // la fonction preg accepte les tableaux, pour effectuer plusieurs operations // php pour le remplacement ?>
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.


Commentaires
1. Le mardi 19 avril 2005 à 22:12, par lantno
2. Le mercredi 3 août 2005 à 00:45, par thomas576
3. Le vendredi 23 décembre 2005 à 14:39, par o_be_one
4. Le mardi 18 avril 2006 à 09:34, par Le zen man
5. Le lundi 17 juillet 2006 à 11:59, par Elglobo
6. Le lundi 28 août 2006 à 11:14, par Desty Nova
7. Le mercredi 18 octobre 2006 à 14:42, par neodelphi
8. Le dimanche 5 novembre 2006 à 10:09, par Zeuf
9. Le mardi 6 février 2007 à 01:45, par chat
10. Le mercredi 23 mai 2007 à 00:57, par Jens
11. Le mardi 5 juin 2007 à 09:07, par Benz8
12. Le dimanche 24 juin 2007 à 20:06, par booraq
13. Le samedi 30 juin 2007 à 23:20, par lancia
14. Le samedi 5 janvier 2008 à 00:41, par test qi
15. Le jeudi 31 janvier 2008 à 16:36, par tt_fl
16. Le vendredi 1 février 2008 à 11:56, par Fouzy
17. Le vendredi 7 mars 2008 à 23:07, par Zabu
Ajouter un commentaire