Mémo sur les expressions régulières

SpeedyWeb / Dev (PHP / JS) / Mémo sur les expressions régulières

Les délimiteurs

Le motif doit être encadré par des délimiteurs.
Les plus courant : "/", "#", "~", "\", "+", "%".

Exemple: $motif = '#^[^0-9]$#';

Les métacaractères

Les métacaractères sont les "caractères spéciaux" pouvant figurer entre crochets ou bien n'importe ou dans un masque.

À l'extérieur des crochets, les métacaractères sont :

 

\
antislash Caractère de protection, avec de multiples usages
^
Accent circonflexe Le début de la chaîne sujet (ou de ligne, en mode multilignes)
$
Dollar La fin de la chaîne sujet ou avant la fin d'une nouvelle ligne (ou fin de ligne, en mode multilignes)
.
Point Remplace n'importe quel caractère, hormis le caractère de nouvelle ligne (par défaut) ;
[
Crochet ouvrant Caractère de début de définition de classe
]
Crochet fermant
Caractère de fin de définition de classe
(
Parenthèse ouvrante Caractère de début de sous-masque
)
Parenthèse fermante Caractère de fin de sous-masque
?
Point d'interrogation Étend le sens de (; quantificateur de 0 ou 1; quantificateur de minimisation (Voir les répétitions)
*
Étoile Quantificateur de 0 ou plus
+
Plus Quantificateur de 1 ou plus
{
Accolade ouvrante Caractère de début de quantificateur minimum/maximum
}
Accolade fermante Caractère de fin de quantificateur minimum/maximum


La partie du masque qui est entourée de crochets est appelée classe de caractères.

Dans les classes de caractères, les seuls métacaractères autorisés sont :

 

\
antislash Caractère de protection, avec de multiples usages
^
Accent circonflexe Négation de la classe, mais uniquement si placé tout au début de la classe
-
Moins Indique un intervalle de caractères

Les séquences d'échappement

Le caractère "\" est utilisé comme caractère d'échappement s'il est suivi d'un caractère alphanumérique.

L'antislash peut aussi être utilisé pour coder des caractères invisibles :

A noter : \n suffit dans l'expression, pas besoin d'utiliser \\n.

 

\n nouvelle ligne
\r retour chariot
\t tabulation

 

Plus d'exemples sur la doc php.net

Se servir de l'antislash pour préciser des types génériques de valeurs :

 

\d tout caractère décimal
\D tout caractère qui n'est pas un caractère décimal
\h n'importe quel espace horizontal (depuis PHP 5.2.4)
\H n'importe quel caractère qui n'est pas un espace horizontal (depuis PHP 5.2.4)
\s tout caractère blanc
\S
tout caractère qui n'est pas un caractère blanc
\v n'importe quel espace vertical (depuis PHP 5.2.4)
\V n'importe quel caractère qui n'est pas un espace vertical (depuis PHP 5.2.4)
\w tout caractère de "mot"
\W tout caractère qui n'est pas un caractère de "mot"

Les ancres

^ Début d'une chaine.
Il n'a pas besoin d'être le premier caractère du masque, si plusieurs alternatives sont proposées, mais il doit être placé en premier dans chaque alternative.

$ Fin de chaine.
Peut être placé juste avant un caractère de nouvelle ligne qui serait le dernier caractère de la chaîne.
Il n'a pas besoin d'être le dernier caractère du masque, si plusieurs alternatives sont proposées, mais il doit être placé en dernier dans chaque alternative.

Le point

. Remplace n'importe quel caractère même invisible sauf nouvelle ligne.
Avec l'option PCRE_DOTALL il remplace n'importe qu'el caractère.

Les classes de caractères

Les classes de caractères sont introduites entre crochets [...].
Si un crochet fermant est nécessaire à l'intérieur d'une classe de caractères, il est nécessaire qu'il soit le premier caractère ou doit être échappé.

La classe de caractère remplace un seul caractère dans la chaine sujet.
Placé en premier, le caractère "^" indique la négation : le caractère ne doit pas se trouver dans la classe.
Exemple : [aeiou] n'importe qu'ellle voyelle minuscule / [^aeiou] Tout sauf une voyelle minuscule.

Le signe "-" représente un intervale de caractères.
Si ce caractère doit être présent dans une classe, il doit être placé au début ou à la fin de la classe.
Exemple : [d-m] Toutes les lettres entre d et m inclus.

Les types de caractères \d, \D, \S, \s, \w, \W peuvent aussi intervenir dans les classes de caractères.
Exemple : [][\^_`wxyzabc][\dABCDEF] acceptera n'importe quel caractère exadécimal.

Tous les caractères autres que \, -, ^ (placés en début de chaîne) et ] n'ont pas de signification particulière mais ne perdront rien à être protégés.

Les notations POSIX

[:alnum:] lettres et chiffres
[:alpha:] lettres
[:ascii:] codes caractères 0 - 127
[:blank:] espace ou tabulation uniquement
[:cntrl:] caractères de contrôle
[:digit:] chiffres décimales (identique à \d)
[:graph:] caractères d'impression, excluant les espaces
[:lower:] lettres en minuscule
[:print:] caractères d'impression, incluant les espaces
[:punct:] caractères d'impression, excluant les lettres et les chiffres
[:space:] espace blanc (par tout à fait identique à \s)
[:upper:] lettres en majuscule
[:word:] caractères composant un mot (identique à \w)
[:xdigit:] chiffres hexadécimaux

 

La négation est indiquée par le caractère ^ après un double-point.
Exemple[12[:^digit:]] trouve "1", "2" et tout caractère qui n'est pas un chiffre.

Les alternatives

Le caractère "|" permet de séparer les différentes alternatives.
Le nombre d'alternatives n'est pas limité et il est possible d'utiliser une chaine vide.
Exemple : /dupont|martin/ recherche soit "dupont" soit "martin".

Les options de recherche

i PCRE_CASELESS Effectue une recherche insensible à la casse.
m PCRE_MULTILINE Ne tient pas tenir compte des retours chariot. Les métacaractères "début de ligne" (^) et "fin de ligne " ($) ne sont valable qu'une seule fois.
s PCRE_DOTALL Le point (.) remplace n'importe quel caractère, y compris les nouvelles lignes.
x PCRE_EXTENDED Les caractères d'espacement sont ignorés, sauf s'ils sont échappés, ou à l'intérieur d'une classe de caractères, et tous les caractères entre # non échappés et en dehors d'une classe de caractères, et le prochain caractère de nouvelle ligne sont ignorés.
(Permet l'ajout de commentaires dans les masques compliqués.)
e PREG_REPLACE_EVAL OBSOLETE depuis PHP 5.5.0.
Avec cette option, " preg_replace()" effectue la substitution normale des références arrières dans la chaîne de remplacement, puis l'évalue comme un code PHP, et utilise le résultat pour remplacer la chaîne de recherche.
A PCRE_ANCHORED le masque est ancré de force, c'est-à-dire que le masque doit s'appliquer juste au début de la chaîne sujet pour être considéré comme trouvé.
D PCRE_DOLLAR_ENDONLY

le métacaractère $ ne sera valable qu'à la fin de la chaîne.
Pas d'équivalent PERL.

S   Analyse de masque plus poussée, pratique lorsqu'il est boucoup utilisé.  Actuellement, cette analyse n'est utile que pour les masques non ancrés, qui ne commencent pas par un caractère fixe.
U PCRE_UNGREEDY

Inverse la tendance à la gourmandise des expressions rationnelles. Vous pouvez aussi inverser cette tendance au coup par coup avec un ? mais cela rendra gourmand la séquence.
Non compatible PERL.

Note: Limite de pcre.backtrack_limit caractères en mode non gourmand.

X PCRE_EXTRA

Tous les antislashs suivis d'une lettre qui n'aurait pas de signification particulière causent une erreur, permettant la réservation de ces combinaisons pour des ajouts fonctionnels ultérieurs.
Non compatible PERL.

J PCRE_INFO_JCHANGED L'option (?J) interne de configuration modifie l'option locale PCRE_DUPNAMES. Permet la duplication de noms pour les sous-masques.
u PCRE_UTF8

Désactive les fonctionnalités additionnelles de PCRE qui ne sont pas compatibles avec Perl. Les chaînes sont traitées comme des chaînes UTF-8.
Disponible à partir de PHP 4.1.0 sur UNIX et PHP 4.2.3 sur Windows.

Les sous-masques

Les sous-masques peuvent êtrent imbriqués et sont délimités par des (...).

Utilisation comme parenthèses capturantes :

Lorsque tout le motif correspond, la portion de la sous-chaine qui correspond au sous-masque est passé à l'appelant grâce à l'argument ovector de pcre_exec(). Les parenthèses ouvrantes sont comptées depuis la gauche vers la droite (commençant à 1) jusqu'à obtenir le nombre des sous-masques capturants.

Exemple : soit la chaîne sujet "le roi soleil" utilisée avec le masque: Le ((roi|prince) (soleil|charmant)), les sous-masques capturés sont "roi soleil", "roi", et "soleil", numérotés respectivement 1, 2, et 3.

Localiser un ensemble d'alternatives :

Exemple : cat(aract|erpillar|) trouve un des mots "cat", "cataract", ou "caterpillar". Sans les parenthèses, cela trouverait "cataract", "erpillar" ou la chaine vide.


Le nombre maximal de chaînes capturées est de 99, et le nombre total de sous-masques (capturant ou non) ne doit pas dépasser 200.

Les répétitions

Les répétitions sont spécifiées avec des quantificateurs, qui peuvent être placés à la suite des caractères suivants :

  • Un caractère unique, même s'il s'agit d'un métacaractère
  • Le métacaractère "."
  • Une classe de caractères
  • Une référence de retour
  • Un sous-masque avec parenthèses (à moins que ce ne soit une assertion)

Les quantificateurs généraux se précisent entre {...} et sont séparés par des virgules : {0,5}.
Ces nombres doivent êtrent plus petits que 65536, le premier doit être inférieur ou égal au second.
Exemple : z{2,4} accepte "zz", "zzz", ou "zzzz".

Si le second nombre est omis et que la virgule est présente, cela veut dire qu'il n'y a pas de limite.
Exemple : [aeiou]{3,} accepte n'importe quelle succession d'au moins 3 voyelles minuscules

Si la virgule est elle aussi omise, la quantité correspond exactement au chiffre indiqué.
Exemple : \d{8} n'accepte que 8 chiffres exactement

Les trois quantificateurs les plus communs ont une abréviation d'un seul caractère :

* équivalent à {0,} 0, 1 ou plusieurs occurrences
+ équivalent à {1,} 1 ou plusieurs occurrence
? équivalent à {0,1} 0 ou 1 occurrence

 

Les quantificateurs sont dits "gourmands" : ils cherchent d'abord à trouver le nombre maximal de répétitions possibles.
Exemple de cette gourmandise : Le masque /\*.*\*/  avec la chaîne /* premier commentaire */ aucun commentaire /* second commentaire */ échoue, car le masque travaille sur la totalité de la chaîne, à cause de la gourmandise du caractère .*.
Pour ne rechercher que le nombre minimum de répétition, un quantificateur doit être suivi d'un point d'interrogation.
Exemple : \d??\d va tenter de lire un seul chiffre, mais le cas échéant, acceptera 2 chiffres pour permettre à la recherche d'aboutir.
Avec PCRE_UNGREEDY (option de recherche U), les quantificateurs ne sont pas gourmands par défaut.

Suivis par "+", les quantificateurs sont dits "possessifs" : Ils mangent autant de caractères que possible et ne retournent pas travailler avec le reste du masque. (accélère le traitement)

Ajouter un commentaire

Les commentaires sont modérés à priori : votre contribution n'apparaîtra qu'après avoir été validée par un administrateur du site.

Êtes-vous un robot ? Pour le savoir complétez l'addition: 1 + 1 =