Initiation aux expressions régulières en PHP

Image non disponible


précédentsommairesuivant

III. Fonctions

III-1. 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.

Trouver les noms propres dans un tableau
Sélectionnez
<?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

Tester ce script

III-2. preg_match_all()

Permet de trouver toutes les occurences qui satisfont un masque dans une chaîne. Retourne le nombre de succès.

Trouver les noms propres dans une chaîne
Sélectionnez
<?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.

Tester ce script

Trouver les liens dans une chaîne
Sélectionnez
<?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 guillements, le tout dans une balise d'ancrage HTML.
  • (.*)</a> : Une chaîne quelconque suivie de la balise fermante de l'ancrage.

Tester ce script

III-3. 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).

Déterminer si une adresse e-mail est syntaxiquement valide
Sélectionnez
<?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

Tester ce script

III-4. 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.

Déterminer si une chaîne est une question (présence d'une majuscule et d'un point d'interrogation)
Sélectionnez
<?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

Tester ce script

III-5. preg_replace()

Permet de remplacer au moyen d'une regex. Retourne la chaîne modifiée.

BBCode simple
Sélectionnez
<?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

Tester ce script

III-6. 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.

BBCode complexe
Sélectionnez
<?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]

Tester ce script

III-7. 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.

Découper une chaîne
Sélectionnez
<?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.

Tester ce script


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Guillaume Rossolini. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.