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.


