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 |
] |
|
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 |
|
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. |
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. 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. |
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. |
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.