Chargement...

PHP les expression régulières


Les expression régulières ( ou regex ) sont des modèles permettant de manipuler des chaines de caractères. Elles permettent de trouver un mot, des portions de la chaîne, une phrase ou un type de donnée dans une chaine.

preg_match

Exemple: Je veux savoir si dans la phrase "Mon nom est olivier", mon prénom apparaît.
<?php
if(preg_match("/olivier/", "Mon nom est olivier")){
echo "OUI";
}
else{
echo "NON";
}
?>
OUI

Commence par

Je peux faire des recherches plus avancées, par exemple je veux savoir si la phrase commence par mon nom:
<?php
if(preg_match("/^olivier/", "Mon nom est olivier")){
echo "OUI";
}
else{
echo "NON";
}
?>
NON

Termine par

Ou alors est ce que la phrase termine par mon nom?
<?php
if(preg_match("/olivier$/", "Mon nom est olivier")){
echo "OUI";
}
else{
echo "NON";
}
?>
OUI

Les caractères spéciaux

On peut chercher en fait à peu près ce que l'on veux du moment qu'on sait traduire notre pensée en modèle. Il exisite des caractères réservée pour exprimer une idée de recherche évoluée.

Les alphanumeriques

Est-ce que ma chaine commence par une lettre de l'alphabet?
<?php
if(preg_match("/^[a-zA-Z]/", "abc")){
echo "OUI";
}
else{
echo "NON";
}
?>
OUI
<?php
if(preg_match("/^[a-zA-Z]/", "éabc")){
echo "OUI";
}
else{
echo "NON";
}
?>
NON
Est-ce que ma chaine commence par un chiffre?
<?php
if(preg_match("/^[0-9]/", "6abc")){
echo "OUI";
}
else{
echo "NON";
}
?>
OUI
<?php
if(preg_match("/^[0-9]/", "éabc")){
echo "OUI";
}
else{
echo "NON";
}
?>
NON

Les symboles ^ $ * + ? | - [] . et {}

Symbole Description
^ Commence par
$ Termine par
* Zéro ou plusieurs
+ Un ou plusieurs
? Un ou aucun
. Représente un caractère unique
- Représente un intervalle
() Définit un élément composé de l'expression régulière qu'elle contient
[] Définit une liste de caractères autorisés
(x|y) Chaine qui contient x ou y
x{2} Chaine qui contient 2 x
x{2,5} Chaine qui contient 2,3,4 ou 5 x
On comprend souvent beaucoup plus facilement avec des exemples:
ModèleStringRéponse
/^[a-z]$/abcdefNON
/^[a-z]*$/abcdefOUI
/^[a-z]?$/abcdefNON
/^[a-z]+$/abcdefOUI
/[a-z]/abcdef1OUI
/[a-z]*/abcdef1OUI
/^[a-z]*$/aBcdefNON
/^[a-z]*$/iaBcdefOUI
/^[a-zA-Z]*$/aBcdefOUI
/^[a-zA-Z]*$/aBcdef1NON
/^[a-zA-Z0-9]*$/aBcdefOUI
/.com/abc.comOUI
/[.com]/abc.comOUI
/[.moc]/abc.comOUI
/.moc/abc.comNON
/cool/coolOUI
/cool/cooolNON
/c(o)l/coolNON
/c(o)*l/coolOUI
/c(o)?l/coolNON
/c(o){1}l/coolNON
/c(o){2}l/coolOUI
/c(o){3}l/coolNON
/c(o){0,2}l/coolOUI
/(w){3}\.([a-z]+)\.(fr|com)/www.google.frOUI
/(w){3}\.([a-z]+)\.(fr|com)/www.google.comOUI
/(w){3}\.([a-z]+)\.(fr|com)/www.g1oogle.frNON
/(w){3}\.([a-z]+)\.(fr|com)/www..frNON
/(w){3}\.([a-z]+)\.(fr|com)/google.frNON
/(w){3}\.([a-z]+)\.(fr|com)/ww.google.frNON

Exercice Expressions régulières

Exercice: Vous pouvez jouer à deviner si la condition est TRUE dans le tableau ci-dessous:
ModèleStringRéponse
/^[a-z]$/abcdefNON
/^[a-z]*$/abcdefOUI
/^[a-z]?$/abcdefNON
/^[a-z]+$/abcdefOUI
/[a-z]/abcdef1OUI
/[a-z]*/abcdef1OUI
/^[a-z]*$/iaBcdefOUI
/^[a-z]*$/aBcdefNON
/^[a-zA-Z]*$/aBcdefOUI
/^[a-zA-Z]*$/aBcdef1NON
/^[a-zA-Z0-9]*$/aBcdefOUI
/.com/abc.comOUI
/[.com]/abc.comOUI
/[.moc]/abc.comOUI
/.moc/abc.comNON
/cool/coolOUI
/cool/cooolNON
/c(o)l/coolNON
/c(o)*l/coolOUI
/c(o)?l/coolNON
/c(o){1}l/coolNON
/c(o){2}l/coolOUI
/c(o){3}l/coolNON
/c(o){0,2}l/coolOUI
/(w){3}\.([a-z]+)\.(fr|com)/www.google.frOUI
/(w){3}\.([a-z]+)\.(fr|com)/www.google.comOUI
/(w){3}\.([a-z]+)\.(fr|com)/www.g1oogle.frNON
/(w){3}\.([a-z]+)\.(fr|com)/www..frNON
/(w){3}\.([a-z]+)\.(fr|com)/google.frNON
/(w){3}\.([a-z]+)\.(fr|com)/ww.google.frNON

Récupérer données du modèle

On peut par ailleurs récupérer les données qui corresponde au modèle:
<?php
preg_match("/%(olivier)%/", "Mon nom est %olivier% bla bla bla .", $resultat);
var_dump( $resultat );
?>
array (size=2)  
0 => string '%olivier%' (length=9)  
1 => string 'olivier' (length=7)

preg_match_all

Si plusieurs résultats sont attendus, vous devez utiliser la fonction preg_match_all.
Exemple:
<?php
$data = '
<a href="/page1.php">PAGE 1</a>
<a href="/page2.php">PAGE 2</a>
<a href="/page3.php">PAGE 3</a>';
preg_match_all('/<a [^>]+>(.*)<\/a>/', $data, $names);
preg_match_all('/ href="(.*)"/', $data, $href);
var_dump( $names );
var_dump( $href );
?>
Résultat:
array (size=2)
0 =>array (size=3)
	0 => string '<a href="/page1.php">PAGE 1</a>' (length=31) 
	1 => string '<a href="/page2.php">PAGE 2</a>' (length=31) 
	2 => string '<a href="/page3.php">PAGE 3</a>' (length=31)  
1 => array (size=3)      
	0 => string 'PAGE 1' (length=6)      
	1 => string 'PAGE 2' (length=6)      
	2 => string 'PAGE 3' (length=6)
array (size=2)
0 => array (size=3)
	0 => string ' href="/page1.php"' (length=18)
	1 => string ' href="/page2.php"' (length=18)
	2 => string ' href="/page3.php"' (length=18)
1 => array (size=3)
	0 => string '/page1.php' (length=10)
	1 => string '/page2.php' (length=10)
	2 => string '/page3.php' (length=10)

PREG_REPLACE

On peut vérifier qu'une chaine de caractère respecte un modèle mais on peut aussi remplacer les données correspondantes par la valeur que l'on désire.
<?php
$text = preg_replace("/olivier/", "James Bond", "Mon nom est olivier");
echo $text;
?>
Résultat:
Mon nom est James Bond
La logique de modèle est la même que pour preg_match.

Supprimer une balise et son contenu

<?php
$content = "..."; // contenu HTML
$content =
preg_replace(
'`<script[^>]*>.+?</script>`is',
"",
$content
);
?>



Crée votre site web au meilleur prix💰


CSSW Apprendre à créer son site web