Expressions régulières Sites sur le même sujet Télécharger des documentations

Qu'est-ce qu'une expression régulière?

Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, c'est-à-dire permettant de trouver les portions de la chaîne correspondant au modèle. Ce système est emprunté au système POSIX (un système d'exploitation). De nombreux scripts sous UNIX les utilisent (notamment Perl).

En réalité il s'agit d'un système fort ingénieux (et aussi très puissant) permettant de retrouver un mot, ou une phrase (et même beaucoup d'autres choses en réalité) dans un texte, ressemblant au modèle que l'on a construit...

Construire une expression régulière

Les expressions régulières permettent de rechercher des occurences (c'est-à-dire une suite de caractères correspondant à ce que l'on recherche) grâce à une série de caractères spéciaux. L'expression réguliè en elle-même est donc une chaîne de caractère contenant des caractères spéciaux et des caractères standards...

Les symboles ^ et $ indiquent le début ou la fin d'une chaine, et permettent donc 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"
Les symboles *, + et ?, respectivement "zero ou plusieurs", "un ou plusieurs", "un ou aucun", permettent de donner une notions 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..) 

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")
A noter que le premier nombre de la limite ("{0,2}", mais pas "{,2}") est obligatoire. Les symboles vu précedemment ('*', '+', and '?') sont équivalents à "{0,}", "{1,}", et "{0,1}".

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


"a(bc)*": chaine qui contient "a" suivie de zero "bc" ou plus 
La barre verticale | se comporte en tant qu'opérateur OU

"un|le": chaine qui contient "un" ou "le"
"(un|le) chien": chaine qui contient "un chien" ou "le chien"
"(a|b)*": chaine qui contient une suite de "a" ou de "b" 
Le point . indique n'importe quel caractère (une fois)

"^.{3}$": chaine qui contient 3 caractères
Les crochets [ ] définissent une liste de caractères autorisés (ou interdits). Le signe - permet quand à lui de définir un intervalle. Le caractère ^ après le premier crochet indique quand à lui une interdiction.

"[abc]": chaine qui contient un "a", un "b", ou un "c"
"[a-z]": chaine qui contient un caractère compris entre "a" et "z"
"[^a-zA-Z]": chaine 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 (sauf entre crochets)
  • un antislash doit donc être doublé!
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.


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

Voici un tableau récapitulatif des caractères spéciaux utilisés dans les expressions régulières:

Caractère Utilité
[] Les crochets définissent une liste de caractères autorisés
() Les parenthèse définissent un élément composé de l'expression régulière qu'elle contient
{} Les accolades lorsqu'elles contiennent un ou plusieurs chiffres séaprés par des virgules représente le nombre de fois que l'élément précédant les accolades peut se reproduire (par exemple p{2,5} correspond à ppp, pppp ou ppppp
- Un moins entre deux caractères dans une liste représente un intervalle (par exemple [a-d] représente [abcd])
. Le caractère point représente un caractère unique
* Le caractère astérisque indique la répétition indéterminée de l'élément la précédant
? Le caractère "point d'interrogation indique la présence éventuelle de l'élément la précédant
| Occurence de l'élément situé à gauche de cet opérateur ou de celui situé à droite (lard|cochon)
^
  • Placé en début d'expression il signifie "chaîne commençant par .. "
  • Utilisé à l'intérieur d'une liste il signifie "ne contenant pas les caractères suivants...
$ Placé en fin d'expression il signifie "chaîne finissant par .. "

 

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. Voici un tableau récapitulant certaines de ces classes:

Nom de la classe Description
[:alnum:] caractères alphanumériques (équivalent à [A-Za-z0-9])
[:alpha:] caractères alphabétiques ([A-Za-z])
[:blank:] caractères blanc (espace, tabulation)
[:ctrl:] caractères de contrôe (les premiers du code ASCII
[:digit:] chiffre ([0-9])
[:graph:] caractère d'imprimerie (qui fait une marque sur l'écran en quelque sorte)
[:print:] caractère imprimable (qui passe à l'imprimante ... 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
Voici quelques exemples d'utilisation des classes de caractère dans une expression régulière :

chaine composée d'un ou plusieurs caractère(s) alphanumerique(s)

"^[:alnum:]+$"
chaine contenant un caractère de ponctuation ou un caractère d'espacement
"[:punct:]|[:space:]"
Un nombre
"^[:digit:]+$"

Les fonctions de manipulation d'expressions régulières

PHP fournit quelques fonctions de bases permettant de manipuler des chaînes à l'aide d'expressions régulières.

Les fonctions ereg() et eregi()

La fonction ereg() dont le prototype est le suivant:
Booleen ereg(chaine modele,chaine texte[,tableau occurences])
permet d'évaluer le texte passer en argument grâce au modèle (qui est une expression régulière) et stocke toutes les occurences dans un tableau passé optionnellement en paramètre. Lorsque la fonction trouve des occurences, elle renvoie true, sinon elle retourne false.

La fonction eregi() dont le prototype est le suivant:
Booleen eregi(chaine modele,chaine texte[,tableau occurences])
effectue le même travail que sa consoeur ereg(), à la différence près qu'elle n'est pas sensible à la casse (pas de différenciation minuscules/majuscules)


<?
$fp = fopen("http://www.commentcamarche.net","r"); //lecture du fichier
while (!feof($fp)) { //on parcoure toutes les lignes
  $page .= fgets($fp, 4096); // lecture du contenu de la ligne
} 
$titre = eregi("<title>(.*)</title>",$page,$regs); //on isole le titre
/* Le titre commence par <title>, 
puis contient n'importe quelle chaine, 
et se termine par </title> */
echo $regs[1]; // on retourne la premiere occurence trouvée 
// Les occurences se trouvent entre parenthèses
// $regs[0] renvoie toute la chaine
fclose($fp); 
?>

Les fonctions ereg_replace() et eregi_replace()

La fonction ereg_replace() dont le prototype est le suivant:
chaine ereg_replace(chaine modele,chaine remplacement,chaine texte)
Permet de retourner la chaine texte passée en arguments avec les occurences trouvees remplacées par la chaine de remplacement.
Pour utiliser les occurences correspondant au modele dans la chaine de remplacement, il suffit d'utiliser des parenthèses dans la chaine modele, puis de faire référence à ces éléments dans la chaine de remplacement en utilisant deux signes antislash suivi d'un numéro identifiant l'élément entre 0 et 9 (les numéros sont donnés par ordre d'imbriquement, puis de gauche à droite, le zéro représente la chaine entière).
Le code suivant remplace Toto par <b>Toti Toto</b>... inutile mais formateur.


$Texte = "Bienvenue a Toto dans le mondes des expressions régulières";
$Texte = ereg_replace("To(to)","<b>\\1ti \\0</b>",$texte);

Le code suivant (utilisation avancée des expressions régulières) remplace un URL par un hypertexte HTML (il remplace toute suite de caractères de ponctuations et alphanum&eacuyte;riques commençant par http://, ou ftp:// par le même texte (sans le http://) entre balises HTML hypertexte...):


$Texte = "Bienvenue sur http://www.commentcamarche.net cher ami";
$Texte = ereg_replace("((http://)([[:punct:]]|[[:alnum:]])*)","<a href=\"\\0\">\\2</a>",$corps);

La fonction eregi_replace() dont le prototype est le suivant:
chaine eregi_replace(chaine modele,chaine remplacement,chaine texte)
effectue le même travail que sa consoeur ereg_replace(), à la différence près qu'elle n'est pas sensible à la casse (pas de différenciation minuscules/majuscules).

La fonction split()

La fonction split() possède la syntaxe suivante:


tableau split (chaîne expression, chaîne texte [, entier limite])  
La fonction split() retourne un tableau à partir d'une chaine 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 chaine. Si une erreur se produit, split retourne 0.

<?
// 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";
$tableau_mots = split(" +",trim($phrase)); // un espace ou plus
?>

La fonction sql_regcase()

La fonction sql_regcase() possède la syntaxe suivante:


chaine sql_regcase (chaine texte)  
Elle retourne une expression régulière qui représente la chaine passée en paramètre sans tenir compte de la case. Chaque caractère de la chaine 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ères. Aucune explication ne vaut un bon exemple ;)

<?
echo sql_regcase("un test"); 
// affiche [Uu][Nn][  ][Tt][Ee][Ss][Tt]
?>
Cette fonction permet de générer une chaine 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 chaine non sensible à la casse à l'aide de sql_regcase.

<?
$motclef = sql_regcase("motclef");
$sql = "SELECT * from table WHERE champ REGEXP "[[:<:]]$motclef[[:>:]]"; 
// selectionne tous les enregistrements de la table table, contenant le MOT motclef 
?>

Pour plus d'informations PHP France


© Copyright 2001 Jean-François Pillou
Ce document issu de CommentCaMarche.net est soumis à la licence GNU FDL.Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.