Les fonctions PCRE PHP

Dans cette nouvelle leçon, nous allons découvrir les différentes fonctions internes au PHP qui vont nous permettre d’exploiter toute la puissance des expressions régulières. Cela devrait rendre l’intérêt des expressions régulières beaucoup plus concret pour vous.

 

Référence : liste des fonctions PCRE PHP

Le PHP dispose de fonctions internes qui vont nous permettre d’utiliser nos masques pour par exemple rechercher une expression dans une chaine, la remplacer par une autre, etc.

Les fonctions PHP relatives aux regex commencent toutes par preg_).

Voici la liste de ces fonctions, que nous allons étudier par la suite, ainsi qu’une courte description de leur action.

FonctionDescription
preg_filter()Recherche et remplace
preg_grep()Recherche et retourne un tableau avec les résultats
preg_last_error()Retourne le code d’erreur de la dernière regex exécutée
preg_match()Compare une regex à une chaine de caractères
preg_match_all()Compare une regex à une chaine de caractères et renvoie tous les résultats
preg_quote()Echappe les caractères spéciaux dans une chaine
preg_replace()Recherche et remplace
preg_replace_callback()Recherche et remplace en utilisant une fonction de rappel
preg_replace_callback_array()Recherche et remplace en utilisant une fonction de rappel
preg_split()Découpe une chaine

Dans cette partie, nous allons déjà voir comment utiliser chacune de ces fonctions. Cela vous permettra ainsi de voir immédiatement l’utilité des regex. Nous approfondirons par la suite le sujet des expressions régulières en soi.

 

Les fonctions PHP preg_match() et preg_match_all()

Les fonctions PHP preg_match() et preg_match_all() vont être les fonctions qu’on va le plus utiliser avec nos expressions régulières.

Ces deux fonctions vont nous permettre de rechercher un schéma dans une chaine de caractères. Elles vont donc nous permettre de vérifier la présence d’une certaine séquence de caractères dans une chaine de caractères.

La fonction preg_match() va renvoyer la valeur 1 si le schéma recherché est trouvé dans la chaine de caractères ou 0 dans le cas contraire.

La fonction preg_match_all() va renvoyer le nombre total de fois où le schéma de recherche a été trouvé dans la chaîne de caractères sous forme de tableau.

Chacune de ces deux fonctions va pouvoir accepter jusqu’à 5 arguments mais seuls 2 arguments sont obligatoires à leur fonctionnement. Ces deux arguments sont le masque ou schéma de recherche passé sous forme de chaine de caractères ainsi que la chaine de caractères dans laquelle effectuer la recherche.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $masque = '/r/';
            $chaine = 'Je suis Pierre Giraud';
            
            if(preg_match($masque, $chaine)){
                echo 'Le caractère "r" a été trouvé '
                .preg_match_all($masque, $chaine).
                ' fois dans "' .$chaine. '"<br>';
            }else{
                'Aucun "r" dans "' .$chaine. '"<br>';
            }
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation de la fonction PHP preg_match_all

Dans l’exemple précédent, nous utilisons le schéma de recherche /r/ puis on demande à preg_match() de rechercher le présence de notre schéma de recherche r dans la chaine de caractères « Je suis Pierre Giraud ».

Si preg_match() trouve effectivement un r, elle renvoie 1 (qui va être évalué à true) et on rentre dans le if. Dans le cas contraire, notre fonction renvoie 0 (qui est évalué à false, rappelons-le) et on entre dans le else.

Au sein de contre condition if, on utilise également la fonction preg_match_all() pour compter le nombre de fois que le schéma r est rencontré dans notre chaine de caractères.

On va ensuite pouvoir passer d’autres arguments à nos fonctions preg_match() et preg_match_all() qui vont nous permettre d’effectuer des recherches plus ciblées ou d’obtenir des informations supplémentaires par rapport à notre recherche.

Le premier argument facultatif qu’on va pouvoir passer à ces deux fonctions va être une variable dans laquelle vont être stockés les résultats de la recherche sous forme d’un tableau.

Dans le cas de preg_match(), le tableau sera un tableau numéroté. La première valeur du tableau sera le texte qui satisfait le masque complet, la deuxième valeur sera le texte qui satisfait la première parenthèse capturante de notre masque et etc. Nous allons voir plus tard comment utiliser des parenthèses dans nos regex.

Dans le cas de preg_match_all(), le tableau sera un tableau multidimensionnel ordonné. Par défaut, notre tableau multidimensionnel principal va contenir en première valeur un tableau qui va lui-même contenir les résultats qui satisfont le masque complet, puis va contenir en deuxième valeur un tableau qui contient les résultats qui satisfont la première parenthèse capturante et etc. Une nouvelle fois, nous illustrerons cela lorsque nous aurons une plus grande connaissance des regex.

Le deuxième argument facultatif de nos fonctions va être un drapeau (une constante) qui va nous permettre de modifier la façon dont notre tableau passé en argument précédent va être créé. Nous ne rentrerons pas dans un tel niveau de précision ici.

Finalement, le dernier argument facultatif permet de préciser à partir de quel endroit dans la chaine de caractères passé la recherche doit commencer. Cet argument est très pratique pour n’effectuer une recherche que sur une partie de chaine. On va ici passer une valeur en octets.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $masque = '/r/';
            $chaine = 'Je suis Pierre Giraud';
            $match = [];//On ititilise $match et $match_all (non obligatoire)
            $match_all = [];
            
            preg_match($masque, $chaine, $match);
            preg_match_all($masque, $chaine, $match_all);
            
            echo '<pre>';
            print_r($match);
            echo '<br><br>';
            print_r($match_all);
            echo '</pre>';
            
            $m2 = [];//On initialise $m2 (non obligatoire)
            $res = preg_match_all($masque, $chaine, $m2, PREG_PATTERN_ORDER, 15);
            echo 'On recherche "' .$match_all[0][0]. '" en partant 15 octets
            après le début de la chaine de caractères. ' .$res. ' résultat(s)
            trouvé(s).';
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation de la fonction PHP preg_match

Ici, j’utilise le drapeau PREG_PATTERN_ORDER qui est la constante utilisée par défaut pour preg_match_all() (et qui importe donc peu) et on demande à preg_match_all() de rechercher notre schéma de recherche à partir du 15è octet de notre chaine de caractères.

Pour le moment, nos recherches sont très simples et ont donc peu d’intérêt. Cependant, nous allons ensuite apprendre à créer des schémas de recherche complexes qui vont nous permettre de valider des formats de données : on va par exemple pouvoir vérifier qu’une chaine donnée a bien la forme d’une adresse mail ou d’une URL ou encore d’un numéro de téléphone par exemple.

 

Les fonctions PHP preg_filter(), preg_replace(), preg_replace_callback() et preg_replace_callback_array()

La fonction preg_filter() va nous permettre d’effectuer une recherche dans une chaine de caractères selon un schéma de recherche et de remplacer les correspondances par une autre chaine.

On va passer trois arguments à cette fonction : un schéma de recherche, une chaine de remplacement et la chaine dans laquelle faire la recherche.

La fonction preg_filter() va ensuite renvoyer la chaine transformée. Attention : la chaine de départ ne sera pas modifiée.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $masque = '/jour/';
            $chaine = 'Bonjour, je suis Pierre';
            
            $res = preg_filter($masque, 'soir', $chaine);
            echo 'Chaine transformée : ' .$res. '<br>
                  Chaine de départ : ' .$chaine;
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation de la fonction PHP preg_filter

Ici, on se sert de preg_filter() pour rechercher le schéma jour dans notre chaine de caractères. Dans le cas où il est trouvé, on le remplace par la chaine soir dans le résultat retourné.

Encore une fois, notre chaine de départ n’est pas modifiée en soi. On peut le voir lorsqu’on echo le contenu de notre variable $filter_res après avoir utilisé preg_filter().

La fonction preg_replace() va fonctionner exactement comme preg_filter(). La seule différence entre ces deux fonctions va être dans la valeur retournée si le schéma de recherche n’est pas trouvé dans la chaine de caractères.

En effet, dans ce cas-là, la fonction preg_filter() va renvoyer la valeur null (correspondant à l’absence de valeur) tandis que preg_replace() va renvoyer la chaine de caractères de départ.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $masque = '/jour/';
            $masque2 = '/azerty/';
            $chaine = 'Bonjour, je suis Pierre';
            
            $filter_res = preg_filter($masque, 'soir', $chaine);
            echo 'Chaine transformée : ' .$filter_res. '<br>
                  Chaine de départ : ' .$chaine. '<br><br>';
                  
            $replace_res = preg_filter($masque, 'ne année', $chaine);
            echo 'Chaine transformée : ' .$replace_res. '<br>
                  Chaine de départ : ' .$chaine. '<br><br>';
            
            //Essayons avec un schéma de recherche qui ne sera pas trouvé
            $filter_res2 = preg_filter($masque2, 'soir', $chaine);
            $replace_res2 = preg_replace($masque2, 'soir', $chaine);
            echo 'Résultat de preg_filter() : ' .$filter_res2. '<br>
                  Résultat de preg_replace() : ' .$replace_res2;
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation de la fonction PHP preg_replace

Finalement, les fonctions preg_replace_callback() et preg_replace_callback_array() vont fonctionner selon le même principe général que preg_replace() à la différence qu’il faudra préciser une fonction de rappel plutôt qu’une valeur de remplacement.

Ce sujet est un peu complexe à votre niveau et je ne veux pas vous embrouiller davantage pour le moment, nous laisserons donc cette fonction de côté pour l’instant.

La fonction PHP preg_grep()

La fonction preg_grep() va nous permettre de rechercher un certain schéma dans un tableau. Les résultats trouvés (les correspondances) seront renvoyés dans un nouveau tableau en conservant les indices du premier tableau.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $masque = '/Pierre/';
            $tb = ['Pierre Gr', 'Mathilde Ml', 'Pierre Dp', 'Florian Dc'];
            
            $grep_res = preg_grep($masque, $tb);
            
            echo '<pre>';
            print_r($grep_res);
            echo '</pre>';
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation de la fonction PHP preg_grep

 

La fonction PHP preg_split()

La fonction preg_split() va éclater une chaine de caractères en fonction d’un schéma de recherche et renvoyer un tableau.

A chaque fois que le schéma de recherche est trouvé dans la chaine de départ, preg_split() crée un nouvel élément dans le tableau renvoyé.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            $masque = '/j/';
            $chaine = 'Bonjour, je suis Pierre';
            
            $split_res = preg_split($masque, $chaine);
            echo '<pre>';
            print_r($split_res);
            echo '<pre>';
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation de la fonction PHP preg_split

 

La fonction PHP preg_quote()

La fonction preg_quote() va nous permettre d’échapper certains caractères spéciaux pour les regex.

Utiliser preg_quote() correspond à placer un antislash (le caractère d’échappement ou de protection) devant chaque caractère spécial.

Cette fonction peut s’avérer utile lorsque notre schéma de recherche possède beaucoup de caractères spéciaux dont on veut échapper le sens.

Nous reparlerons des caractères spéciaux et de l’échappement des caractères plus tard dans cette partie.

 

La fonction PHP preg_last_error()

La fonction preg_last_error() va être surtout utilisée pour du débogage.

En effet, celle-ci va retourner le code d’erreur correspondant à la dernière regex utilisée.

On pourra donc utiliser cette fonction lorsqu’une de nos regex ne fonctionne pas, afin d’avoir plus d’informations sur la nature du problème.

Laisser un commentaire