Programmation PHP/Expressions rationnelles

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche


Syntaxe[modifier | modifier le wikicode]

Expressions rationnelles courantes
Caractère Type Explication
. Point n'importe quel caractère
[...] crochets classe de caractères : tous les caractères énumérés dans la classe
[^...] crochets et circonflexe classe complémentée : tous les caractères sauf ceux énumérés
^ circonflexe marque le début de la chaine, la ligne...
$ dollar marque la fin d'une chaine, ligne...
| barre verticale alternative - ou reconnaît l'un ou l'autre
(...) parenthèses groupe de capture : utilisée pour limiter la portée d'un masque ou de l'alternative
* astérisque 0, 1 ou plusieurs occurrences
+ le plus 1 ou plusieurs occurrences
? interrogation 0 ou 1 occurrence
Classes de caractères POSIX[1]
Classe Signification
[[:alpha:]] n'importe quelle lettre
[[:digit:]] n'importe quel chiffre
[[:xdigit:]] caractères hexadécimaux
[[:alnum:]] n'importe quelle lettre ou chiffre
[[:space:]] n'importe quel espace blanc
[[:punct:]] n'importe quel signe de ponctuation
[[:lower:]] n'importe quelle lettre en minuscule
[[:upper:]] n'importe quelle lettre capitale
[[:blank:]] espace ou tabulation
[[:graph:]] caractères affichables et imprimables
[[:cntrl:]] caractères d'échappement
[[:print:]] caractères imprimables exceptés ceux de contrôle
Expressions rationnelles Unicode[2]
Expression Signification
\A Début de chaine
\b Caractère de début ou fin de mot
\d Chiffre
\D Non chiffre
\s Caractères espace
\S Non caractères espace
\w Lettre, chiffre ou underscore
\W Caractère qui n'est pas lettre, chiffre ou underscore
\X Caractère Unicode
\z Fin de chaine

Débogueur : https://regex101.com/

  • ?: : ignorer le groupe de capture lors de leur numérotation. Ex : ((?:sous-chaine_non_renvoyée|autre).)
  • ?! : négation. Ex : ((?!sous-chaine_exclue).)
  • $1 : désigne le résultat du premier groupe de capture dans les remplacements.
Attention !
link={{{link}}}

De plus, pour chercher un dollar, "\$" ne fonctionne pas car c'est le format de certaines variables. Il faut donc utiliser des apostrophes au lieu des guillemets : '\$'.

En PHP, les patterns regex doivent toujours être entourés d'un symbole délimiteur. On utilise généralement l'accent grave (`), mais on trouve aussi souvent / et #. Ceci sous peine de ne pas fonctionner avec Warning: no ending delimiter found.

De plus, on peut ajouter des options après ces délimiteurs :

i insensibilité à la casse
m le "." inclut les retours à la ligne
x ignorer les espaces
o lors d'un remplacement, ne traite que la première correspondance
u compte les caractères Unicode (en multi-octet)

Recherche[modifier | modifier le wikicode]

La fonction ereg() qui permettait de rechercher en regex a été remplacée par preg_match() depuis PHP 5.3.

preg_match()[modifier | modifier le wikicode]

La fonction preg_match()[3] est la principale fonction de recherche[4]. Elle renvoie un booléen et demande deux paramètres obligatoires : l'expression rationnelle et la chaine à scanner. Le troisième paramètre correspond à la variable dans laquelle stocker le tableau des résultats. Enfin, le quatrième accepte un flag PHP, modifiant le comportement de base de la recherche.

  • Exemple minimal :
<?php
$chaine = 'Test regex PHP pour Wikibooks francophone.';

if (preg_match('`.*Wikibooks.*`', $chaine)) {
    print('Le texte parle de Wikibooks');
} else {
    print('Le texte ne parle pas de Wikibooks'); 
}
?>
  • Exemple avancé :
<?php
$chaine = 'Test regex PHP pour Wikibooks francophone.';

if (preg_match('`.*Wikibooks.*`', $chaine), résultats, $flag) {
    var_dump(résultats);
} else {
    print('Le texte ne parle pas de Wikibooks'); 
}
?>

Exemples de flags[5] :

  • PREG_OFFSET_CAPTURE : affiche la position de la sous-chaine recherchée dans la chaine.
  • PREG_GREP_INVERT : affiche l'inverse dans preg_grep().

preg_grep()[modifier | modifier le wikicode]

Cette fonction recherche dans les tableaux[6].

preg_match_all()[modifier | modifier le wikicode]

Pour obtenir tous les résultats dans un tableau, remplacer preg_match par preg_match_all[7], et print par print_r.

Pour filtrer le contenu d'un fichier, par exemple récupérer tout ce qui se trouve entre parenthèses dans un tableau :

$regex = "/\(([^)]*)\)/";
preg_match_all($regex, file_get_contents($nomFichier), $matches);
print_r($matches);


Remplacement[modifier | modifier le wikicode]

preg_replace()[modifier | modifier le wikicode]

La fonction preg_replace comprend trois paramètres : remplacé, remplaçant, chaine à traiter.

<?php
// Remplace tous les espaces par des underscores
$chaine="Test regex PHP pour Wikibooks francophone.";
$chaineTriee=preg_replace('`( )`','_',$chaine);
echo $chaineTriee;
?>

preg_filter()[modifier | modifier le wikicode]

Idem que preg_replace() mais son résultat ne contient que ce qui est effectivement remplacé.

preg_split()[modifier | modifier le wikicode]

Décompose une chaine de caractères.

Références[modifier | modifier le wikicode]