Table des matières
Regex
Cette page s'adresse essentiellement à des gens qui ont quelques notions de regex, mais qui ne connaissent qu'une partie des fonctionnalités ou ont la fâcheuse tendance à les oublier. C'est une sorte de Cheat Sheet complète et détaillée. Si vous débutez en regex, je vous conseille de commencer par un véritable tutoriel plus détaillé encore.
Regex, pour “regular expression” et qui se traduit par “expréssion régulière”, désigne une méthode et une syntaxe codifiée permettant de rechercher/contrôler/extraire des motifs définit dans une chaine de caractère.
Les regex définie à la base pour Perl, ont été adaptée en PHP avec quelques subtilités évoquées sur cette page.
Fonctions
En PHP, les principales fonctions utilise des expressions régulières sont décrites ci-dessous.
Toujours, $pattern
(NdT : “motif”) désigne l'expression régulière. Les autres paramètres sont détaillés dans chaque cas. Seuls les paramètres obligatoires/principaux sont évoqués. Pour les autres ou pour toute spécificité, consulter directement la documentation PHP.
preg_grep
$matches = preg_grep( $pattern, $array );
Retourne les éléments de $array
qui respectent le motif. Voir la doc.
preg_match
$int = preg_match( $pattern, $string, $matches )
$string
: chaîne à analyser$matches
(facultatif) : tableau des occurences respectants le motif.- résultat : 1 si trouvé, 0 sinon, et
false
en cas d'erreur
preg_match_all
$int = preg_match_all( $pattern, $string, $matches )
$string
: chaîne à analyser$matches
(facultatif) : tableau des occurences respectants le motif.- résultat : nombre d'occurences (peut être 0), et
false
en cas d'erreur
Ressemble beaucoup à preg_match
, mais diffère légèrement dans son fonctionnement. Voir la doc.
preg_replace
$result = preg_replace( $pattern, $replace, $subject )
Remplace les occurences du motifs par une chaine donnée.
$replace
: chaîne Chaine de remplacement$subject
: chaîne ou tableau dans lequel effectuer le(s) remplacement(s)- résultat : chaîne ou tableau correspondant à
$subject
et où les remplacements ont été faits
preg_split
$array = preg_split( $pattern, $string )
Découpe une chaine de caractère en utilisant comme séparateur le motif. Voir la doc.
Syntaxe et règles
Base
Déclaration
Pour déclarer une regex, il faut l'encadrer en mettant le même caractère en début et fin de regex. La plupart du temps, on utilise l'un des caractères suivants (notez que si vous voulez utiliser ce caractère au sein de votre regex, il faudra l'échapper) :
/ ~ # %
Cet encadrement sera souvent omis par la suite, sauf dans les extraits complets de code PHP. Notez que la regex /a/
sera déclaré en php par $regex='/a/';
.
Texte
De base, les regex permettent de rechercher une bête chaine de caractères, comme le ferait un strpos()
. Ainsi, le motif to
remontera une occurence dans la chaine Toto
(Pas le premier To
car sensible à la casse).
Caractères spéciaux et Echappement
Les motifs suivent une syntaxe particulière, essentiellement basée sur l'utilisation de 12 caractères spéciaux :
\ ^ $ . | ? * + ( ) [ {
Si vous souhaitez utiliser l'un de ces caractères pour sa valeur réelle, il faut l'échapper avec un anti-slash \
. Par exemple pour trouver les correspondance du motif exact a+b
, il faudra définir le motif ainsi : a\+b
On notera que si )
en fait partie, ce n'est pas le cas de ]
et }
(ou plus exactement cela dépendra du contexte, mais vous n'aurez à priori pas à les échapper).
Concernant les caractères non imprimables (retour à la ligne, tabulations, etc…), il faut employer la syntaxe suivante (échappement d'un caractère “classique”, souvent une lettre) :
Caractère non imprimable | Syntaxe |
---|---|
Tabulation | \t |
Carriage return | \r |
Line feed | \n |
Rappel : un retour à la ligne est désigné par \n
sous Linux/Unix et par \r\n
sous Windows.
Utilisation en PHP
Comme il s'agit du même caractère d'échappement que celui utilisé par PHP, il faudra parfois le doubler.
Ainsi, le motif \'
devra être déclaré de l'une des deux manières suivantes :
$pattern = '/\\\'/'; //échapper le \ et le ' $pattern = "/\\'/"; //échapper le \, le ' n'en a pas besoin ici
Pour la suite de cette page, c'est la syntaxe de base, sans les échappements de PHP, qui sera utilisée, sauf si le motif est présenté au sein d'un extrait de code PHP.
Classes de caractères
Base
Une classe de caractères est une règle désignant “n'importe lequel des caractères” parmi une liste définie. La classe est toujours encadrée par des crochets. Ainsi [ab]
trouvera une correspondance pour n'importe quel occurence de a
ou de b
.
Plage
Une classe peut désigner une plage de caractère. Pour cela, on indique le premier et le dernier caractère de la plage, séparés par un tiret -
. Ainsi, [a-z]
trouvera une correspondance pour n'importe quelle lettre de l'alphabet en minuscule.
Les plages peuvent être cumulée : [a-zA-Z0-9\t]
correspond à n'importe quelle majuscule, minuscule, chiffre ou tabulation.
Négation
On peut vouloir faire l'inverse grâce au caractère ^
: pour trouver correspondance dans n'importe quel caractère qui n'est pas un chiffre, il suffit d'utiliser la classe [^0-9]
.
Soustraction et Intersection
Ces fonctionnalités ne semblent pas exister en PHP.
Echappement
Au sein d'une classe, tous les caractères spéciaux peuvent être échappés selon les règles évoquées plus haut. Cependant, du fait de ce qu'on vient de voir dans ce chapitre, seul les les suivants le nécessitent, et seulement dans les positions où leur signigication devient ambigüe :
\ ] ^ -
Raccourcis
Des classes prédéfinies peuvent être utilisées. Dans le cadre de PHP, cela ne fonctionnera que pour de l'ASCII. Ces raccourcis peuvent être utilisés au sein d'une classe (comme n'importe quelle plage à associer à d'autres éléments) ou tel quel (pour en faire une classe à part entière).
Raccourci | Equivalent | Négation | Signification | Note |
---|---|---|---|---|
\d | [0-9] | \D ou [^\d] | digit (chiffre) | |
\w | [A-Za-z0-9_] | \W ou [^\w] | word (mot) | |
\s | [ \t\r\n\f] | \S ou [^\s] | whitespaces (espaces, tabulations, etc…) | |
\h | [\t\p{Zs}] | à vérifier | horizontal whitespaces (espaces horizontaux) | PHP 5.2.2+ |
\v | [\n\cK\f\r\x85\x{2028}\x{2029}] | à vérifier | vertical whitespaces (espaces verticaux) | PHP 5.2.2+ |
Le point
Le point (.
) correspond à presque n'importe quel caractère à l'exception des retours à la ligne. Si vous souhaitez aussi inclure ces caractères spéciaux, il est possible, en fin de regex, de préciser cela par la lettre s
. Ainsi /./s
correspondra à n'importe quel caractère y compris les retours à la ligne, tandis que /./
excluera ces derniers.
Les ancres
Début et fin
Les ancres servent à désigner le début (^
) ou la fin ($
) d'une chaine de caractère. Ainsi ^a
retournera une si et seulement la chaine analysée commence par a
. Idem avec a$
si la chaine fini par a
.
C'est beaucoup utiliser pour simplement vérifier le format de l'ensemble d'une chaine de caractère. Exemple : vérifier une chaine sensée ne contenir qu'une date au format jj/mm/aaaa : #^\d{2}/\d{2}/\d{4}$#
Limites d'un mot
Le caractère \b
correspond à la limite d'un mot, qu'il s'agisse d'un espace, d'un retour à la ligne, etc… Mais contrairement à [ ]
, par exemple, cette methode correspondra à une chaine de longueur nulle. Il s'agit plus d'une “position” qu'autre chose.
Alternatives
Les alternatives sont gérées grâce à |
. De la même manière que les classes, elles permettent de trouver des correspondances parmi plusieurs choix possibles. Ainsi, l'|le|la
trouvera correspondance pour l'
, le
ou la
, et a|b|c
reviendra au même que [abc]
.
Répétition et éléments optionnels
Il existe plusieurs méthodes pour indiquer la possible répétition d'un caractère, d'une classe ou d'un groupe (voir plus bas).
Méthode | Explication |
---|---|
a? | répétition consécutives de a entre 0 et 1 fois |
a* | répétition consécutives de a entre 0 et n fois |
a+ | répétition consécutives de a entre 1 et n fois |
a{3} | répétition consécutives de a 3 fois : aaa |
a{3,} | répétition consécutives de a entre 3 et n fois |
Les groupes
Base
Si vous souhaitez appliquer une option, un règle à une section de votre regex qui ne peut pas être désignée de manière unitaire (c'est-à-dire qui n'est pas un caractère unique ou une classe unique), vous pouvez simplement encadrer toute ladite section entre parenthèse.
Ainsi, (to){2}
trouvera correspondance dans toutes les occurences de toto
, et to{2}
pour too
(répétition du o
, mais pas du t
).
Capture
L'utilisation d'un groupe engendre une capture, qui peut ensuite être réutilisée (voir chapitre sur les référence). Si vous ne comptez pas réutiliser cette capture, vous pouvez la désactiver pour optimiser votre regex grâce à ?:
. Ainsi (to)
pourra être réutilisé tandis que (?:to)
ne le pourra pas.
Référence
Chaque groupe de capture onbtient automatiquement un identifiant qui peut être ensuite réutilisé plus loin dans la regex. Ainsi to(to)? et ti(ti) \1\2
revient au même que to(to)? et ti(ti) (to)(ti)
.
Cependant, toute référence cherchera non pas le même motif que le groupe, mais bien la même chaine qui a été trouvée en correspondance avec le motif la première fois.
Il est possible (en PHP en tout cas) de faire appel à une référence avant la déclaration du groupe. Par contre une référence à un groupe qui n'existe pas engendrera une erreur.
Il est possible d'effectuer une référence au sein même du groupe qu'elle est sensée référencer. Cependant, PHP a quelques spécificités à ce propos.
Webographie
- regular-expressions.info (en) : tuto très complet d'où vient une bonne partie des éléments de cette page.