Cours par Webcam

Cours par Webcam

Formateur Web pour adultes depuis plus 11 ans, je vous propose des COURS collectifs par WEBCAM en LIVE pour booster vos connaissances et être autonome dans la création de site.

En savoir plus

PHP - Bases

PHP - Algorithmie

PHP - Chaîne

PHP - Tableau

PHP - Formulaires

PHP - Fonctions Usuelles

Données entres pages

Environnement et Interaction

PHP objet (POO)

Facebook
Twitter
LinkedIn

Expressions régulières en PHP

Les expressions jouent un rôle très important dans le traitement de chaînes. Ils permettent de vérifier la validité des chaines de caractères, comme vérifier un email, des saisies chiffrées… Ils peuvent aussi être utiliser pour traiter des éléments à l’intérieur de la chaîne (extraire, remplacer).

Il existe deux types d’expressions utilisées avec PHP : POSIX et PCRE (Perl Compatible Regular Expression) Les expressions PCRE (héritée de Perl) sont bien plus puissantes que les POSIX. Nous utiliserons ce type pour notre tutoriel.

La fonction preg_match() vérifie que le format d’une chaîne correspond à un motif (ou masque). Il fonctionne avec deux paramètres, le motif et la chaîne à traiter en deuxième paramètre. La fonction retourne false si le format de la chaîne ne correspond pas au motif.

<?php
$chaine = "daniel";
$motif = '/dan/'; // motif 'dan'
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Dans cet exemple la fonction preg_match() trouve le motif ‘dan’ dans la chaîne et retourne ‘format correct’.

Pour déclarer la chaine motif, il faut l’encadrer par des délimiteurs. Les délimiteurs les plus courants sont les slashes (/), dièses (#) et les tildes (~). Ici nous utilisons les slashes ‘/’.

<?php
$motif1 = '/ /';
$motif2 = '# #';
$motif3 = '~ ~';
?>

Échappement dans le motif

Si le motif utilise le même caractère que les délimiteurs, il faudra échapper tous les caractères présents dans le motif avec le backslash ‘\’.

<?php
$motif1 = '/3\/2/'; // échappement nécessaire
$motif2 = '#3/2#'; // pas besoin d'échappement
?>

La fonction preg_quote() peut être utilisée pour échapper une chaine et l’utiliser dans un motif. Les caractères spéciaux qui seront protégés sont les suivants : \ + * ? [ ^ ] $ ( ) { } = ! < > | : –

<?php
$motif = '\ + * ? [ ^ ] $ ( ) { } = ! < > | : - /';
$motif = preg_quote($motif,'/'); // le second paramètre protège le '/' ignoré par défaut
echo $motif;
?>

Affichage

\\ \+ \* \? \[ \^ \] \$ \( \) \{ \} \= \! \< \> \| \: \- \/

Son second paramètre optionnel sert à spécifier le délimiteur qui doit être aussi échappé, comme ‘/’ qui est très utilisé comme délimiteur.

Les métacaractères

Pour constituer le motif qui fait toute la puissance des expressions régulières, vous allez apprendre à faire l’usage des métacaractères.

Voici la liste de ceux qui sont reconnus n’importe où dans un motif (ou masque) :

  • \ : Caractère d’échappement, avec de multiples usages
  • ^ : Le début de la chaîne (ou de ligne, en mode multilignes)
  • $ : La fin de la chaîne ou avant la fin d’une nouvelle ligne (ou fin de ligne, en mode multilignes)
  • . : Remplace n’importe quel caractère, hormis le caractère de nouvelle ligne (par défaut)
  • [ : Caractère de début de définition de classe
  • ] : Caractère de fin de définition de classe
  • | : Caractère de début d’alternative (ou)
  • ( : Caractère de début de sous-masque
  • ) : Caractère de fin de sous-masque
  • ? : Quantificateur de 0 ou 1
  • * : Quantificateur de 0 ou plus
  • + : Quantificateur de 1 ou plus
  • { : Caractère de début de quantificateur minimum/maximum
  • }: Caractère de fin de quantificateur minimum/maximum

Voici un exemple concret d’utilisation des métacaractères. Nous allons créer un motif pour vérifier que la chaîne se termine par ‘pa’ avec le métacaractère $.

<?php
$chaine = "le papa";
$motif = '/pa$/';
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Pour vérifier que la chaîne commence par le premier caractère du motif, on utilise le métacaractère ^.

<?php
$chaine = "le papa";
$motif = '/^pa/';
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format incorrect

Dans ce cas, le motif n’est pas vérifié puisque la chaîne commence par ‘le’.

Pour vérifier que la chaîne commence et se termine par les caractères du motif , on utilise à la fois le métacaractère ^ et le métacaractère $.

<?php
$chaine = "le papa";
$motif = '/^papa$/';
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format incorrect

Dans ce cas même si ‘papa’ est trouvé, le format est incorrect parce que la chaîne ne commence par par ‘p’.

Recherche alternative

La recherche alternative consiste à vérifier la présence d’un motif ou un autre, et se réalise avec la barre verticale (pipe|.

<?php
$chaine = "mon ami daniel";
$motif = '/daniel|robert/'; // recherche 'daniel' ou 'robert'
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Caractère joker

Le caractère point . représente n’importe quel caractère, sauf le caractère de fin de ligne (sauf si le modificateur s est activé). Si vous souhaitez utiliser le point comme un caractère normal, il faudra l’échapper.

<?php
$chaine = "Mon ami daniel.";
$motif = '/.\./'; // recherche n'importe quel caractère avant le point
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Dans cet exemple, le premier point est le caractère joker tandis que le deuxième est échappé et représente le point de fin de phrase de la chaîne.

Les sous-masques

Les parenthèses ( ) permettent de créer des sous-masques. Les sous-masques peuvent être utiles pour localiser un ensemble d’alternatives. Par exemple, le motif da(niel|vid|) trouve « daniel » ou « david ». Sans les parenthèses, il trouverait « daniel » ou « vid ».

<?php
$chaine = "je m'appelle daniel";
$motif = '/da(niel|vid)/'; // recherche 'daniel' ou 'robert'
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Les quantificateurs

Il est possible de répéter une recherche à plusieurs caractères, comme rechercher entre 3 et 6 fois le caractère ‘b’. Pour faire une répétition, il suffit de faire suivre la caractère recherché par un ou plusieurs nombres entre accolades { }, exemple : /a{3,6}/.

Recherche fixe

Pour définir une répétition sur un nombre fixe, faire suivre la caractère recherché par un seul nombre entre accolades.

<?php
$chaine = "ouiiii";
$motif = '/i{3}/'; // recherche 3 répétitions de 'i'
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Recherche délimité

Pour définir une répétition entre deux limites, faire suivre la caractère recherché par deux nombres séparés par une virgule entre accolades.

<?php
$chaine = "ouiiii";
$motif = '/i{3,5}/'; // recherche la répétition de 'i' entre 3 et 5 fois
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Recherche minimum

Pour définir une répétition sur un nombre minimum de répétitions, faire suivre la caractère recherché par un nombre suivi d’une virgule entre accolades.

<?php
$chaine = "ouiiii";
$motif = '/i{2,}/'; // recherche au moins 2 'i'
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Quantificateurs sur un métacaractère

Vous pouvez gérer la répétition avec 3 métacaractères :

  • * : entre 0 et plusieurs fois -> équivalent à {0,}
  • + : au moins une fois -> équivalent à {1,}
  • ? : entre 0 et 1 fois -> équivalent à {0,1}
<?php
$chaine = "01-12-75";
$motif = '/0?1/'; // recherche 1 zéro ou pas avant le '1'
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Répéter une chaîne

Si la répétition d’un seul caractère n’est pas suffisant, vous pouvez répéter une chaîne complète en la délimitant entre des parenthèses

<?php
$chaine = "papa";
$motif = '(pa){2}/'; // recherche 2 fois la chaîne 'pa'
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format incorrect

Les classes de caractères

Une classe de caractères correspond à une liste de caractères autorisés et se créée avec les crochets [ ].

<?php
$chaine = "daniel";
$motif = '/[aeuiyo]/'; // recherche de voyelles dans la chaine
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Dans cet exemple, la présence dans la chaîne d’une des voyelles spécifiées dans la classe permet de valider le format.

Les classes prédéfinies

PHP propose des classes prédéfinies pour faire des vérifications courantes (caractères alphabétiques, les chiffres décimaux, chiffres et lettres). Ces classes sont entourées par un crochet et un deux-points [[: :]]. Par exemple [[:digit:]] valide n’importe quel chiffre.

Voici le liste des plus utilisés :

  • [[:lower:]] : lettres minuscules
  • [[: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

Exemple :

<?php
$chaine = "daniel";
$motif = '/[[:alpha:]]/'; // recherche de lettres dans la chaine
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Intervalle de caractères

Le signe moins  est utilisé pour spécifier un intervalle de caractères, dans une classe. Par exemple [0-9] pour les nombres de 0 à 9, ou [a-z] pour les lettres de l’alphabet.

<?php
$chaine = "daniel";
$motif = '/[a-z]/'; // recherche de caractères alphabétiques
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

Dans cet exemple, la présence dans la chaîne d’un des caractères alphabétiques spécifiés dans la classe permet de valider le format.

Liste de caractères interdits

Pour pouvez définir une liste de caractères qui ne doivent pas être présents dans la recherche en utilisant le signe ^ à l’intérieur d’une classe. Par exemple [^abc] recherche un caractère autre que ‘a’, ‘b’, ou ‘c’.

<?php
$chaine = "daniel ou david";
$motif = '/[^a-z]/'; // recherche de caractères autres que alphabétiques
if(preg_match($motif,$chaine)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

 Subtilité : l’expression [^a-z] ne doit pas être interprétée comme l’exclusion des lettres alphabétiques, mais comme une recherche de caractères autres que alphabétiques. Dans notre cas, la chaîne ‘daniel et david’ possède bien au moins un caractère autre que a-z, comme l’espace entre ‘daniel et ‘ou’.

Récupérer des sous-chaînes

La fonction preg_match() peut accepter un troisième paramètre qui récupère sous forme de tableau toutes les sous-chaines capturées par les sous-masques du motif (index 1 pour le premier sous-masque, index 2 pour le deuxième, etc..) ainsi que toute la chaîne correspondant au motif (index 0 du tableau). On utilisera des parenthèses pour créer les sous-masques.

<?php
$chaine = "http://google.fr";
// les parentèses dans le motif ci-dessous délimitent les sous-masques
$motif = "#(http://)(.+)#";
if(preg_match($motif,$chaine,$match)){
echo 'site de <a href="$match[0]">$match[2]</a>'; // récupèration de 'google.fr' avec $match[2]
}else{
echo "format incorrect";
}
?>

Affichage

site de google.fr

La récupération est très utile pour traiter des éléments à l’intérieur de la chaîne (extraire, remplacer).

Rechercher toutes les occurences

Par défaut la fonction preg_match() recherche que la première correspondance, puis s’arrête de chercher. Si vous voulez récupérer toutes les occurences, utilisez la fonction preg_match_all().

<?php
$chaine = "http://google.fr ou http://google.com";
$motif = '#(http://)([a-z.]+)#';
if(preg_match_all($motif,$chaine,$match)){
print_r($match);
}else{
echo "format incorrect";
}
?>

Affichage

Array ( [0] => Array ( [0] => http://google.fr [1] => http://google.com ) [1] => Array ( [0] => http:// [1] => http:// ) [2] => Array ( [0] => google.fr [1] => google.com ) )

La fonction preg_match_all() renvoie en troisième paramètre un tableau multidimensionnel qui contient toutes les occurences trouvées

Array ( [0] => voici une chaine [1] => et une autre )

Recherche gourmande

Par défaut, dans les cas de répétitions, PHP va valider autant de caractères que possible. La capture est dite gloutonne et trouvera le nombre maximum de caractères qui répond à la recherche.

<?php
$chaine = "daniel ou david";
$motif = '/d([a-z ]+)d/'; // capture 'daniel ou david'
if(preg_match($motif,$chaine,$match)){
echo $match[1];
}else{
echo "format incorrect";
}
?>

Affichage

aniel ou davi

Il est possible de faire une recherche non gourmande, et capturer le moins de caractères possibles. Il suffit de rajouter le point d’interrogation après le symbole de répétition.

<?php
$chaine = "daniel ou david";
$motif = '/d([a-z ]+?)d/'; // capture 'aniel ou '
if(preg_match($motif,$chaine,$match)){
echo $match[1];
}else{
echo "format incorrect";
}
?>

Affichage

aniel ou

Les modificateurs

Le modificateur permet de modifier le fonctionnement de l’expression. Il est placé juste après le délimiteur de fin.

<?php
$chaine = "daniel";
$motif = '/dan/i'; // modificateur i signifie insensible à la casse
?>

Les principaux modificateurs sont :

– Modificateur i : insensible à la casse

<?php
$chaine = "DaniEL";
$motif = '#[a-z]#i';
if(preg_match($motif,$chaine,$match)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format correct

– Modificateur s : la caractère joker (.) peut être utilisé pour valider un caractère de fin de ligne (\n).

<?php
$chaine = "voici une chaine \n et une autre";
$motif = '#^(.+)$#';
if(preg_match($motif,$chaine,$match)){
echo "format correct";
}else{
echo "format incorrect";
}
echo "<br>";
$motif = '#^(.+)$#s';
if(preg_match($motif,$chaine,$match)){
echo "format correct";
}else{
echo "format incorrect";
}
?>

Affichage

format incorrect
format correct

Vous remarquez que dans le premier cas, sans la présence du modificateur s, le joker (.) ne valide pas le retour à la ligne \n.

– Modificateur m : recherche mixtiligne, le retour à la ligne (\n) est considéré par le caractère de début de ligne (^) et de fin de ligne ($).

<?php
/* Sans mofificateur */
$chaine = "voici une chaine \n et une autre";
$motif = '#^(.+)$#';
if(preg_match_all($motif,$chaine,$match)){
print_r($match[0]);
}else{
echo "format incorrect";
}  
echo "<br>";
/* Avec le modificateur 's' */
$motif = '#^(.+)$#s';
if(preg_match_all($motif,$chaine,$match)){
print_r($match[0]);
}else{
echo "format incorrect";
}
echo "<br>";
/* Avec le modificateur 'm' */
$motif = '#^(.+)$#m';
if(preg_match_all($motif,$chaine,$match)){
print_r($match[0]);
}else{
echo "format incorrect";
}
?>

Affichage

format incorrect
Array ( [0] => voici une chaine et une autre )
Array ( [0] => voici une chaine [1] => et une autre )

Dans le premier cas, le retour à la ligne (\n) n’étant pas considéré par le joker (.), la chaîne n’est pas validée. Dans le deuxième cas, la validation est rendue possible avec le modificateur (s) mais (\n) n’est pas interprété comme un retour à la ligne. Dans le troisième cas, grâce au modificateur (m) le retour à la ligne (\n) est considéré par le caractère de début de ligne (^) et de fin de ligne ($) et la fonction preg_match_all() retourne deux résultats correspondants au motif ^(.+)$.

A lire aussi

tutowebdesign

Afficher du contenu au scroll

Afficher du contenu au scroll Voici un effet impressionnant et pourtant très facile à mettre en place sur vos pages. Le principe consiste à faire

Lire »