Outils pour utilisateurs

Outils du site


web:php:regex

Ceci est une ancienne révision du document !


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 complet 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

Voir la doc.

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

Voir la doc.

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

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

TODO : vérifier si cela fonctionne en PHP…

Pour exclure un sous-ensemble d'un plus grand ensemble de caractère sélectionné, on utilise une sous-classe de soustraction. Ainsi [a-z-[aeiouy]] correspondra à n'importe quelle lettre sauf les voyelles (donc uniquement les consonnes).

La soustraction au sein d'une classe de négation ne fera qu'ajouter d'autres caractères à exclures. Ainsi [^abc-[cde]] excluera les caractères a b c d e.

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 :

\ ] ^ -
web/php/regex.1379597587.txt.gz · Dernière modification : le 19/09/2013 à 13:33 de Yosko