III. Fonctions▲
III-A. preg_grep()▲
Permet d'appliquer une regex à chaque élément d'un tableau. Retourne un tableau des éléments pour lesquels la regex s'applique avec succès.
<?php
$pattern
=
"/^[A-Z]/"
;
$subjects
=
array
();
$subjects
[]
=
array
('Yogui'
,
'Guillaume'
,
'expression régulière'
);
$subjects
[]
=
array
('tutoriel'
,
'expressions'
,
'régulières'
);
echo "Le masque <strong>
$pattern
</strong> correspond-il à : <ul>"
;
foreach
($subjects
as
$subject
)
{
echo "<li><strong>"
;
print_r($subject
);
echo "</strong><br />"
;
if
(preg_grep($pattern
,
$subject
))
{
echo "Oui"
;
}
else
{
echo "Non"
;
}
echo "</li>"
;
}
echo "</ul>"
;
?>
Décomposition de la regex : [?]
/^[A-Z]/ => La chaîne commence par une majuscule de l'alphabet
III-B. preg_match_all()▲
Permet de trouver toutes les occurrences qui satisfont un masque dans une chaîne. Retourne le nombre de succès.
<?php
$pattern
=
"/[A-Z][a-z]+/"
;
$subjects
=
array
();
$subjects
[]
=
"je suis Guillaume (alias Yogui)"
;
$subjects
[]
=
"tutoriel sur les expressions régulières"
;
echo "Le masque <strong>
$pattern
</strong> correspond-il à :<br /><ul>"
;
foreach
($subjects
as
$subject
)
{
$matches
=
array
();
echo "<li><strong>
$subject
</strong> ?<br />"
;
if
(preg_match_all($pattern
,
$subject
,
$matches
,
PREG_SET_ORDER))
{
echo "Oui :<br /><pre>"
;
print_r($matches
);
echo "</pre>"
;
}
else
{
echo "Non"
;
}
echo "</li>"
;
}
echo "</ul>"
;
?>
Décomposition de la regex : [?]
/[A-Z][a-z]+/ => Une lettre majuscule de l'alphabet puis au moins une lettre minuscule.
<?php
$pattern
=
"#<a href="
([^
"]+)"
>
(.*
)</
a>
#Usi";
$subjects
=
array
();
$subjects
[]
=
'<a href="http://www.developpez.com/">Accueil de Développez.com</a> - '
.
"
\n
"
.
'<a href="http://www.developpez.net/forums/">Forums de Développez.com</a> - '
;
$subjects
[]
=
'<a href="http://g-rossolini.developpez.com/">Mes articles</a> - '
.
"
\n
"
.
'<a href="http://php.developpez.com/cours/">Les articles PHP de Développez.com</a>'
;
echo "Le masque <strong>
$pattern
</strong> correspond-il à :<br /><ul>"
;
foreach
($subjects
as
$subject
)
{
$matches
=
array
();
echo "<li><strong>
$subject
</strong> ?<br />"
;
if
(preg_match_all($pattern
,
$subject
,
$matches
,
PREG_SET_ORDER))
{
echo "Oui :<br /><pre>"
;
print_r($matches
);
echo "</pre>"
;
}
else
{
echo "Non"
;
}
echo "</li>"
;
}
echo "</ul>"
;
?>
Décomposition de la regex : [?]
/#<a href="([^"]+)">(.*)</a>#Usi/ => Une lettre majuscule de l'alphabet puis tous les caractères jusqu'à la première espace.
Détail :
- <a href="([^"]+)"> : une chaîne quelconque encadrée de guillemets, le tout dans une balise d'ancrage HTML.
- (.*)</a> : une chaîne quelconque suivie de la balise fermante de l'ancrage.
III-C. preg_match()▲
Similaire à preg_match_all(), mais s'arrête au premier résultat. Idéal pour déterminer l'existence d'une sous-chaîne satisfaisant un masque. Retourne un état du succès de l'opération (vrai/faux).
<?php
// Regex fournie par Chris Shiflett
$pattern
=
"/^([^@
\s
<&>]+)@(?:([-a-z0-9]+)
\.
)+([a-z]{2,})$/iD"
;
$subjects
=
array
();
$subjects
[]
=
"http://g-rossolini.developpez.com/"
;
$subjects
[]
=
"truc@domaine.com"
;
$subjects
[]
=
"bidule@autre-domaine.fr"
;
echo "Le masque <strong>
$pattern
</strong> correspond-il à :<br /><ul>"
;
foreach
($subjects
as
$subject
)
{
$matches
=
array
();
echo "<li><strong>
$subject
</strong> ?<br />"
;
if
(preg_match($pattern
,
$subject
,
$matches
,
PREG_SET_ORDER))
{
echo "Oui :<br /><pre>"
;
print_r($matches
);
echo "</pre>"
;
}
else
{
echo "Non<br /><br />"
;
}
echo "</li>"
;
}
echo "</ul>"
;
?>
Décomposition de la regex : [?]
/ ^([^@\s<&>]+)@(?:([-a-z0-9]+)\.)+([a-z]{2,})$ / iD
Détail :
- ^([^@\s<&>]+)@ : au début de la chaîne, tous les caractères qui ne sont pas espace, arobase, <, & et > ; s'ensuit l'arobase
- (?:([-a-z0-9]+)\.)+ : les lettres, chiffres et traits d'union ; le tout est suivi d'un point
- ([a-z]{2,})$ : à partir de deux lettres
- iD : insensible à la casse, pas de caractère de fin de ligne en fin de chaîne
III-D. preg_quote()▲
L'équivalent d'addslashes() pour les regex (mais en plus efficace). Utile pour construire le masque des fonctions PCRE. Retourne la chaîne échappée.
<?php
$patterns
=
array
();
$patterns
[]
=
"/^[A-Z].*'.preg_quote('?').'$/"
;
$patterns
[]
=
"/^[A-Z].*'.preg_quote('...').'$/"
;
$subjects
=
array
();
$subjects
[]
=
"Expression régulière ?"
;
$subjects
[]
=
"J'aime bien les ..."
;
foreach
($patterns
as
$pattern
)
{
echo "Le masque <strong>
$pattern
</strong> correspond-il à :<br /><ul>"
;
foreach
($subjects
as
$subject
)
{
echo "<li><strong>
$subject
</strong> ?<br />"
;
if
(preg_match($pattern
,
$subject
))
{
echo "Oui"
;
}
else
{
echo "Non<br /><br />"
;
}
echo "</li>"
;
}
echo "</ul>"
;
}
?>
Décomposition de la regex : [?]
/ ROSSOLINI / i
Détail :
- ^[A-Z] : une majuscule en début de chaîne
- .* : n'importe quels caractères (voire aucun)
- \?$ : un point d'interrogation ferme la chaîne
- \*$ : une étoile ferme la chaîne
III-E. preg_replace()▲
Permet de remplacer au moyen d'une regex. Retourne la chaîne modifiée.
<?php
$pattern
=
"#
\[
b
\]
(.*)
\[
/b
\]
#"
;
$subjects
=
array
();
$subjects
[]
=
"Initiation aux [b]expressions régulières[/b]"
;
$subjects
[]
=
"Initiation aux expressions [b]rationnelles[/b]"
;
$subjects
[]
=
"Initiation aux expressions <strong>rationnelles</strong>"
;
echo "Le masque <strong>
$pattern
</strong> correspond-il à :<br /><ul>"
;
foreach
($subjects
as
$subject
)
{
echo "<li><strong>
$subject
</strong> ?<br />"
;
if
(preg_match($pattern
,
$subject
))
{
echo "Oui : "
.
preg_replace($pattern
,
"<strong>
$1
</strong>"
,
$subject
);
}
else
{
echo "Non<br /><br />"
;
}
echo "</li>"
;
}
echo "</ul>"
;
?>
Décomposition de la regex : [?]
#\[b\](.*)\[/b\]# => Un bloc BBCode [b] et [/b] encadre n'importe quelle suite de caractères
III-F. preg_replace_callback()▲
Idem que preg_replace(), mais permet d'utiliser une fonction utilisateur pour effectuer les remplacements complexes (plus d'une instruction). Retourne la chaîne modifiée.
<?php
function
color_string($match
)
{
// Ici, nous pourrions faire
// une connexion à une base de données
switch
($match
[
1
]
)
{
case
"red"
:
$new_color
=
"#FF0000"
;
break
;
case
"green"
:
$new_color
=
"#00FF00"
;
break
;
case
"blue"
:
$new_color
=
"#0000FF"
;
break
;
default
:
$new_color
=
NULL
;
break
;
}
if
($new_color
)
{
return
'<font color="'
.
$new_color
.
'">'
.
$match
[
2
].
'</font>'
;
}
else
{
return
$match
[
2
];
}
}
$pattern
=
'#\[colou?r="([a-z]+)"\](.*)\[/colou?r\]#'
;
$subjects
=
array
();
$subjects
[]
=
'expression [color="blue"]régulière[/color]'
;
$subjects
[]
=
'expression [colour="green"]régulière[/color]'
;
$subjects
[]
=
'expression [colour="red"]régulière[/colour]'
;
$subjects
[]
=
'expression [couleur="blue"]régulière[/couleur]'
;
$subjects
[]
=
'expression [color="green"]régulière[/col]'
;
$subjects
[]
=
'expression [font-color="red"]régulière[/font-color]'
;
echo "Le masque <strong>
$pattern
</strong> se trouve-t-il :<ul>"
;
foreach
($subjects
as
$subject
)
{
echo "<li>dans <strong>
$subject
</strong> ?<br />"
;
if
(preg_match($pattern
,
$subject
))
{
echo "Oui : "
.
preg_replace_callback(
$pattern
,
//'color' et 'colour' fonctionnent
"color_string"
,
$subject
);
}
else
{
echo "Non"
;
}
echo "</li>"
;
}
echo "</ul>"
;
?>
Décomposition de la regex : [?]
# \[colou?r="([a-z]+)"\](.*)\[/colou?r\] #
Détail :
- \[colou?r="([a-z]+)"\] : un bloc [color=""] ou [colour=""] contient un nom de couleur (à partir d'une lettre)
- (.*) : n'importe quels caractères (voire aucun) et on les capture
- \[/colou?r\] : un bloc [color] ou [colour]
III-G. preg_split()▲
Alternative PCRE à split(). Idéal pour parcourir un fichier CSV dont on ne connaît pas à l'avance le séparateur de champs.
<?php
$pattern
=
"/[,&
\s
()]/"
;
$subjects
=
array
();
$subjects
[]
=
"je m'appelle Guillaume Rossolini (alias Yogui)"
;
$subjects
[]
=
"ceci est un article sur les expressions régulières"
;
echo "Le masque <strong>
$pattern
</strong> correspond-il à :<ul>"
;
$foreach
($subjects
as
$subject
)
{
echo "<li><strong>
$subject
</strong> ?<br />"
;
if
($matches
=
preg_split($pattern
,
$subject
))
{
echo "Oui : <br /><pre>"
;
print_r($matches
);
echo "</pre>"
;
}
else
{
echo "Non"
;
}
}
echo "</ul>"
;
?>
Décomposition de la regex : [?]
/[,&\s()]/ => Utiliser la virgule, l'esperluette, les caractères d'espacement et les parenthèses pour découper une chaîne.