Recherche rapide
     
Espace Membres
il y'a actuellement 32370 membres
 
Pseudo  
Password  
inscriptions
 
Cours php/Tutoriels
  1/  Apprendre les bases de PHP
  1a/  Divers en PHP, les erreurs, les variables etc...
  2/  Les variables
  3/  Les variables d'environnements
  4/  Les conditions
  5/  Les boucles
  6/  Les cookies
  7/  Travailler sur les dates
  8/  Les tableaux array()
  9/  Travailler avec les fichiers
  10/  Traiter les chaines de caractères
  11/  Récuperer et verifier les données d'un formulaire
  12/  Envoyer des mails
  13/  Les pseudo-frames
  14/  Débuter avec mysql
  15/  Fonctions update et delete de mysql
  16/  Comprendre et utiliser la clause where
  17/  Liste de quelques fonctions mysql
  18/  Mysql par la pratique, construire un livre d'or
  19/  Construire un mini moteur ou annuaire
  20/  Afficher sur plusieurs pages
  21/  La construction de votre forum
  22/  Faire son script de sondage (vote)
  23/  Sessions , mise en pratique
  24/  Sessions , récapitulatif
  25/  Les expressions régulières
  26/  Coder son ANTI-FLOOD
  27/  Utiliser et créer ses fonctions
  28/  Upload et transfert de fichiers
 
 
 
Liens
  Les cours pour bien débuter PHP
Employer des expressions régulières n°25

Ce cours n'a pas encore été mis à jour.

Les expressions régulières permettent de manipuler des chaînes de caractères. Ce système est emprunté au système POSIX (un système d'exploitation). De nombreux scripts sous UNIX les utilisent (notamment Perl). Il s'agit d'un système fort ingénieux, et très puissant, permettant de retrouver un mot, une phrase, ou n'importe quel groupe de caractères, dans un texte suivant le modèle que l'on a défini. Pour la suite du cours, je vais vous parlez de modèles (pattern en anglais). Ces modèles sont en fait des sortes de masques que l'on applique sur une chaîne de caractères ou un texte pour trouver une suite de caractères bien précise. Exemple: retrouver une URL dans un texte.

Syntaxe de base des expressions régulières

Tout d'abord, jetons un coup d'oeil à deux symboles spéciaux: '^' et '$'. Ils indiquent, respectivement, le début et la fin d'un modèle, comme ceci:
  • "^La marmotte": identifie une chaine ou un texte qui commence par "La marmotte";
  • "papier allu$": identifie une chaine ou un texte se finissant par "papier allu";
  • "^abc$": identifie une chaine ou un texte qui commence et finit par "abc" -- c'est donc la chaine "abc" elle-même !
  • "notification": identifie une chaine ou un texte qui contient le mot "notification".
Vous pouvez voir que si vous n'employez pas les deux caractères que nous avons mentionnés, comme dans le dernier exemple, cela veut dire que le modèle peut se produire n'importe où à l'intérieur de la chaine -- vous "ne l'accrochez" à aucun de ses bords. Il y a également les symboles '*', '+', et '?', qui dénotent le nombre de fois qu'un caractère ou une suite de caractères peut se produire. Ils signifient respectivement: "zéro ou plus", "un ou plusieurs", et "zéro ou un". Ces symboles agissent sur les éléments (caractère ou suite de caractères qui les précèdent. Voici quelques exemples:
  • "ab*": identifie une chaine ou un texte contenant un 'a' suivi de zéro ou plusieurs 'b' ("a", "ab", "abbb", etc...);
  • "ab+": même chose, mais là avec au moins un 'b' ("ab ", "abbb", etc...);
  • "ab?": il pourrait y avoir zéro ou un b;
  • "a?b+$": zéro ou un 'a', suivi d'un ou plusieurs 'b' et finissant une chaine ou un texte.
Vous pouvez également employer des limites, qui s'utilisent à l'intérieur d'acollades et qui indiquent des gammes dans le nombre d'occurences. Elles affectent elles aussi l'élément qui les précède :
  • "ab{2}": identifie une chaine ou un texte contenant un 'a' suivi d'exactement deux 'b' ("abb");
  • "ab{2,}": même chose mais avec au moins deux 'b' ("abb ", "abbbb", etc...);
  • "ab{3,5}": idem mais avec de trois à cinq 'b' ("abbb ", "abbbb", ou "abbbbb").
Notez que vous devez toujours indiquer le premier nombre d'une gamme (c-à-d, on doit noter "{0,2}", mais pas "{,2}"). En outre, vous l'avez peut-être remarqué, les symboles '*', '+', et '?' ont respectivement le même effet que les limites "{0,}", "{1,}", et "{0,1}". Maintenant, pour quantifier une séquence de caractères, mettez-la à l'intérieur de parenthèses:
  • "a(bc)*": identifie une chaine ou un texte contenant un 'a' suivi de zéro ou plusieurs copies de la séquence "bc";
  • "a(bc){1,5}": idem mais avec une à cinq copies de la sequence "bc".
Il y a également le symbole '|', qui fonctionne comme l'opérateur OU logique:
  • "salut|bonjour": identifie une chaine ou un texte contenant le mot "salut" ou le mot "bonjour";
  • "(b|cd)ef": une chaine ou texte qui contient la sequence "bef" ou "cdef";
  • "(a|b)*c": une chaine ou un texte qui contient une alternance de 'a' et de 'b' se terminant (l'alternance) par un 'c' ("babababaaaabbbbababc", "c", "ac", "bc", etc.).
Le symbole '.' représente n'importe quel caractère simple:
  • "a.[0-9]": identifie un chaine ou un texte contenant un 'a' suivi d'un caractere puis d'un chiffre;
  • "^.{3}$": identifie une chaine avec exactement 3 caractères.
Les expressions entre crochets indiquent quels caractères sont permis à un endroit precis d'un modèle:
  • "[ab]": identifie une chaine ou un texte contenant un 'a' ou un 'b' (ce qui veut dire la même chose que "a|b");
  • "[a-d]": une chaine ou un text qui contient les lettres en minuscules comprises entre 'a' et 'd' dans l'alphabet (équivaut à "a|b|c|d" ou aussi "[abcd]");
  • "^[a-zA-Z]": une chaine ou un texte qui commence par une lettre minuscule ou majuscule;
  • "[0-9]%": une chaine ou un texte qui contient un pourcentage à un seul chiffre (par exemple: "le CAC40 chute de 9% aujoud'hui");
  • ",[a-zA-Z0-9]$": une chaine qui finit par une virgule suivie d'un caractère alphanumérique.

Vous pouvez également énumérer les caractères que vous ne voulez pas -- juste en utilisant '^' comme premier symbole dans une expression entre crochets (c-a-d., "%[^a-zA-Z]%" qui signifie une chaine avec un caractère qui n'est pas une lettre entre les deux signes pourcentage).
Afin d'être pris littéralement, vous devez échapper les caractères "^.[$()|*+?{\" avec un antislash ('\'), car ils ont une signification spéciale. Avant tout, vous devez échapper le caractère antislash lui-même dans les chaines PHP, ainsi, par exemple, l'expression régulière "(\$|¥)[0-9]+" aurait l'appel de fonction: ereg("(\\$|¥)[0-9]+", $str).

N'oubliez pas que les expressions entre crochets sont une exception à cette règle -- à l'intérieur des crochets, tous les caractères spéciaux, y compris l'antislash ('\'), perdent leurs puissances spéciales (c-à-d, "[*\+?{}.]" signifie exactement n'importe lequel des caractères à l'intérieur des crochets).
Et, comme le mentionne les pages du man de regex: "pour inclure un ']' dans la liste, donnez lui la première place (à la suite d'un '^' si possible). Pour inclure un '-', mettez le en première ou en dernière position, ou au deuxième point final d'une suite." (si c'est pas très clair, le meilleurs moyen reste encore de faire des tests ;))

Pour perfectionner le cours, je devrais mentionner qu'il y a également des ordres lexicographiques, des classes de caractères et des classes équivalentes. Je n'entrerai pas dans des détails, car elles ne seront pas nécessaires pour la suite. Vous devriez vous référer aux pages du man de regex pour plus d'informations.
 

Après la théorie, l'application

Ok, nous pouvons maintenant employer ce que nous avons appris à quelque chose d'utile: une expression régulière pour
vérifier la saisie d'un montant d'argent. Une quantité d'argent peut être écrite de quatre manières différentes que nous
pouvons considérer comme acceptables: "10000,00" et "10.000,00", et, sans les centimes, "10000" et "10.000". Commençons par:

^[1-9][0-9]*$

Cela valide tout nombre qui ne commence pas par un 0. Mais cela signifie également que la chaine "0" ne passe pas l'essai.
Voici une solution:

^(0|[1-9][0-9]*)$

des "juste zéro OU certains nombres qui ne commence pas par un zéro". Nous pouvons également permettre à un signe moins
d'être placé avant le nombre:

^(0|-?[1-9][0-9]*)$

Cela signifie: "un zéro OU un nombre qui ne commence pas par un zéro et pouvant être négatif". Ok, ne soyons pas si strict
et laissons l'utilisateur commencer le nombre avec un zéro. Laissons également tomber le signe moins, car nous n'aurons
pas besoin de lui pour la chaine d'argent. Ce que nous pourrions faire c'est spécifier une possibilité de décimale:

^[0-9]+(\.[0-9]+)?$

Il est implicite dans la partie rouge qu'une virgule (pour les centimes) vient toujours avec au moins un chiffre. Ainsi,
par exemple, "10." n'est pas validé, tandis que "10" et "10,2" le sont.

^[0-9]+(\.[0-9]{2})?$

Nous avons indiqué qu'il doit y avoir exactement deux décimales. Si vous pensez que c'est trop restrictif, vous pouvez
faire ce qui suit:

^[0-9]+(\.[0-9]{1,2})?$

Cela permet à l'utilisateur d'écrire juste un nombre après la virgule. Maintenant, pour les virgules séparant les milliers,
nous pouvons mettre:

^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$

"un ensemble de 1 à 3 chiffres suivis de zéro ensembles ou plus d'une virgule et de trois chiffres." Assez facile, n'est-ce
pas? Mais rendons les virgules facultatives:

^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(\.[0-9]{1,2})?$

Voilà. N'oubliez pas que '+' peut être substitué par '*' si vous voulez que des chaines vides soient acceptées également.
Et n'oubliez pas d'échapper l'antislash pour l'appel de fonction (erreur commune ici). Maintenant, une fois que la chaine
est validée, nous pouvons décoller toutes les virgules avec str_replace(",", "", $money) et typecastons le en double, et
ainsi nous pourons faire des maths avec.

 
Validation d'une adresse email

Ok, prenons des adresses E-mail. Il y a trois parties dans une adresse E-mail: le nom de l'utilisateur POP3 (à gauche du
'@'), '@ ', et le nom de serveur (le reste). Le nom d'utilisateur peut contenir des lettres majuscules ou minuscules, des
chiffres, des points ('.'), des signes moins ('-'), et des signes underscore ('_'). C'est la même chose pour le nom du
serveur excepté pour les signes underscore, qui n'interviennent jamais.

Maintenant, vous ne pouvez pas commencer ou finir un nom d'utilisateur avec un point, ca ne semble pas raisonnable. Il en
va de même pour le nom de domaine. Et vous ne pouvez pas avoir deux points consécutifs, il devrait y avoir au moins un
autre caractère entre eux. Voyons comment écrire une expression pour valider la partie du nom d'utilisateur:

^[_a-zA-Z0-9-]+$

Cela ne permet pas encore l'utilisation du point pour le moment. Changeons-le:

^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$

Cela signifie: "au moins un caractère valide suivi de zéro ou plusieurs chaines constituees d'un point et d'un ou plusieurs
autres caractères valides".

Pour simplifier un peu les choses, nous pouvons employer l'expression ci-dessus avec eregi() , au lieu d'ereg(). Puisque
eregi() n'est pas sensible aux 'case' (il ne fait pas de différence entre minuscules et majuscules), nous n'aurons plus à
spécifier les deux gammes "a-z" et "A-Z" -- une seule suffit:

^[_a-z0-9-]+(\.[_a-z0-9-]+)*$

Pour le nom de serveur c'est pareil, mais sans underscores:

^[a-z0-9-]+(\.[a-z0-9-]+)*$

Ok. Maintenant, on regroupe les deux expressions autour du signe '@', on obtient alors:

^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$

 
Autre utilisations

Extraire des parties d'une chaine : ereg() et eregi() ont un dispositif qui nous permet d'extraire des sous chaines correspondants à des modèles à partir (lisez le manuel pour les détails sur la façon de les employer). Par exemple, disons que nous voulons obtenir le nom de fichier contenu dans une chaine de path/URL -- ce code serait tout ce dont nous aurions besoin:

ereg("([^\\/]*)$", $pathOrUrl, $regs);
echo $regs[1];

Remplacement Avançé
ereg_replace() et eregi_replace() sont également très utiles: supposez que nous voulions séparer tous les mots d'une chaine par des virgules:

ereg_replace("[ \n\r\t]+", ",", trim($str));
 
Tableau Recapitulatif :
(Dans toutes les lignes du tableau, X peut représenter aussi bien un caractère seul qu'une suite de caractères.)
RegEx
Signification
^
en début de chaine
$
en fin de chaine
X* ou X{0,}
X apparait de 0 à n fois
X+ ou X{1,}
X apparait de 1 à n fois
X? ou X{0,1}
X apparait 0 ou 1 fois
X{3,5}
X apparait 3,4 ou 5 fois
X|Y
X ou Y
[a-z]
caractere alphabétique minuscule entre a et z inclus
[A-Z]
caractere alphabétique majuscule entre A et Z inclus
[0-9]
caractère numérique entre 0 et 9 inclus
.
un caratère quelconque
 

A vos claviers et bonne prog
Spinous


>>> Cours suivant n° 1

 

 

 
 
Rubrique installer
  1°/  Apache et PHP
  2°/  Mysql sur votre PC (version tar.gz)
  3°/  Mysql sur votre PC (version rpm)
 
Newsletter

 
Votez !!
Pas de votes ni suggestions actuellement
 
 
 
Débuter Linux
 1°/   Introduction
 2°/   Installation ( 1ere partie )
 3°/   Installation ( 2ème partie )
 4°/   Connexion / documentation / Synthaxe
 5°/   Les différentes commandes sous linux
 6°/   Installer / Désinstaller / Lister les applications
 7°/   Manipulation des chaines de caractères
 
    © Copyright 2005 - az-php.com - tous droits réservés , reproduction interdite . Hébergé par 1hebergeur.com [ mentions légales & copyright ]