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èle | String | Réponse |
/^[a-z]$/ | abcdef | NON |
---|
/^[a-z]*$/ | abcdef | OUI |
---|
/^[a-z]?$/ | abcdef | NON |
---|
/^[a-z]+$/ | abcdef | OUI |
---|
/[a-z]/ | abcdef1 | OUI |
---|
/[a-z]*/ | abcdef1 | OUI |
---|
/^[a-z]*$/ | aBcdef | NON |
---|
/^[a-z]*$/i | aBcdef | OUI |
---|
/^[a-zA-Z]*$/ | aBcdef | OUI |
---|
/^[a-zA-Z]*$/ | aBcdef1 | NON |
---|
/^[a-zA-Z0-9]*$/ | aBcdef | OUI |
---|
/.com/ | abc.com | OUI |
---|
/[.com]/ | abc.com | OUI |
---|
/[.moc]/ | abc.com | OUI |
---|
/.moc/ | abc.com | NON |
---|
/cool/ | cool | OUI |
---|
/cool/ | coool | NON |
---|
/c(o)l/ | cool | NON |
---|
/c(o)*l/ | cool | OUI |
---|
/c(o)?l/ | cool | NON |
---|
/c(o){1}l/ | cool | NON |
---|
/c(o){2}l/ | cool | OUI |
---|
/c(o){3}l/ | cool | NON |
---|
/c(o){0,2}l/ | cool | OUI |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | www.google.fr | OUI |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | www.google.com | OUI |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | www.g1oogle.fr | NON |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | www..fr | NON |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | google.fr | NON |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | ww.google.fr | NON |
Exercice Expressions régulières
Exercice:
Vous pouvez jouer à deviner si la condition est TRUE dans le tableau ci-dessous:
Modèle | String | Réponse |
/^[a-z]$/ | abcdef | NON |
---|
/^[a-z]*$/ | abcdef | OUI |
---|
/^[a-z]?$/ | abcdef | NON |
---|
/^[a-z]+$/ | abcdef | OUI |
---|
/[a-z]/ | abcdef1 | OUI |
---|
/[a-z]*/ | abcdef1 | OUI |
---|
/^[a-z]*$/i | aBcdef | OUI |
---|
/^[a-z]*$/ | aBcdef | NON |
---|
/^[a-zA-Z]*$/ | aBcdef | OUI |
---|
/^[a-zA-Z]*$/ | aBcdef1 | NON |
---|
/^[a-zA-Z0-9]*$/ | aBcdef | OUI |
---|
/.com/ | abc.com | OUI |
---|
/[.com]/ | abc.com | OUI |
---|
/[.moc]/ | abc.com | OUI |
---|
/.moc/ | abc.com | NON |
---|
/cool/ | cool | OUI |
---|
/cool/ | coool | NON |
---|
/c(o)l/ | cool | NON |
---|
/c(o)*l/ | cool | OUI |
---|
/c(o)?l/ | cool | NON |
---|
/c(o){1}l/ | cool | NON |
---|
/c(o){2}l/ | cool | OUI |
---|
/c(o){3}l/ | cool | NON |
---|
/c(o){0,2}l/ | cool | OUI |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | www.google.fr | OUI |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | www.google.com | OUI |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | www.g1oogle.fr | NON |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | www..fr | NON |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | google.fr | NON |
---|
/(w){3}\.([a-z]+)\.(fr|com)/ | ww.google.fr | NON |
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 = "..."; |
$content = |
preg_replace( |
'`<script[^>]*>.+?</script>`is', |
"", |
$content |
); |
?> |
UNE QUESTION SUR L'ARTICLE?