Outils pour utilisateurs

Outils du site


web:php:regex

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
web:php:regex [le 19/09/2013 à 13:33] Yoskoweb:php:regex [le 10/10/2013 à 13:27] (Version actuelle) Yosko
Ligne 1: Ligne 1:
 ====== Regex ====== ====== 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.+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 "[[https://fr.wikipedia.org/wiki/Expression_rationnelle|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. Regex, pour "regular expression" et qui se traduit par "[[https://fr.wikipedia.org/wiki/Expression_rationnelle|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 [[http://regextester.com/pregsyntax.html|cette page]]. Les regex définie à la base pour Perl, ont été adaptée en PHP avec quelques subtilités évoquées sur [[http://regextester.com/pregsyntax.html|cette page]].
 +
 +[[web:php:regex:example|Quelques regex en vrac à garder sous le coude]].
  
 ===== Fonctions ===== ===== Fonctions =====
Ligne 66: Ligne 68:
  
 ==== Base ==== ==== 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) :
 +<code>/ ~ # %</code>
 +
 +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 === === Texte ===
Ligne 98: Ligne 107:
  
 <code php> <code php>
-$pattern = '\\\''; //échapper le \ et le ' +$pattern = '/\\\'/'; //échapper le \ et le ' 
-$pattern = "\\'";  //échapper le \, le ' n'en a pas besoin ici+$pattern = "/\\'/";  //échapper le \, le ' n'en a pas besoin ici
 </code> </code>
  
Ligne 120: Ligne 129:
 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]''. 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 ===+=== Soustraction et Intersection ===
  
-**TODO** : vérifier si cela fonctionne en PHP... +Ces fonctionnalités ne semblent pas exister 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 === === Echappement ===
Ligne 134: Ligne 139:
 \ ] ^ - \ ] ^ -
 </code> </code>
 +
 +=== 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, [[http://www.regular-expressions.info/backref2.html|PHP a quelques spécificités à ce propos]].
 +===== Webographie =====
 +
 +  * [[http://www.regular-expressions.info/tutorial.html|regular-expressions.info (en)]] : tuto très complet d'où vient une bonne partie des éléments de cette page.
web/php/regex.1379597587.txt.gz · Dernière modification : le 19/09/2013 à 13:33 de Yosko