Expressions régulières - PHP

preg, expressions régulières, php, recherche

2009-03-01 – 13:04

2009-03-01 – 13:04

2009-03-06 – 11:08

Les expressions régulières sont le terme rébarbatif que les informaticiens utilisent pour désigner une série d'opérations de recherches de chaînes de caractères dans d'autres chaînes de caractères, recherches qui fonctionnent sur base de jokers ('*') (mais cela va bien au-delà de l'utilisation du caractère 'étoile').

Les expressions régulières sont implémentées dans de nombreux langages: awk, Java, javascript, C, C++, C#, Python, Perl, PHP, ... Ce n'est évidemment pas sans raison car en effet, les expressions régulières permettent d'extraire des informations extrêmement complexes sur base de motifs (patterns) très complets et très précis.

Les expressions régulières sont donc ce qui permet de spécifier les motifs que l'on recherche. Dans le paragraphe d'introduction de cet article nous avons fait référence au caractère spécial '*'. On pourrait dire que c'est UN motif déterminé qui veut dire n'importe quel caractère et en n'importe quel nombre. Dans la même veine, on sait que '?' veut dire n'importe quel caractère mais il ne peut y en avoir qu'un. Ce sont des motifs spécifiques qui ont une signification spécifique.

Cependant, dans un monde d'informaticiens, ces motifs (désormais nous parlerons de patterns) sont insuffisants: les informaticiens veulent pouvoir spécifier bien d'autres conditions, comme par exemple qu'à tel endroit de la chaîne il peut y avoir 3 chiffres, qu'à un autre endroit il ne peut y avoir que des voyelles majuscules suivies d'un caractère qui peut avoir les valeurs '@&!' et qu'enfin il faut que la chaîne se termine par un 'a'.

C'est là que les expressions régulières étendues entrent en jeu.

Plusieurs syntaxes possibles

Il n'existe pas qu'une seule forme d'expressions régulières. Il est donc particulèrement important de savoir quelle syntaxe utiliser. Cet article se contentera de parler des expressions régulières Perl implémentées dans le langage PHP.

Exemples

Rechercher les paragraphes dans une page web

Voilà un texte composé de 2 paragraphes latins. Chaque paragraphe est mis dans une balise <p>:


    Tum Pomponius: At ego, quem vos ut deditum Epicuro insectari soletis, sum 
    multum equidem cum Phaedro, quem unice diligo, ut scitis, in Epicuri hortis, 
    quos modo praeteribamus, sed veteris proverbii admonitu vivorum memini, nec 
    tamen Epicuri licet oblivisci, si cupiam, cuius imaginem non modo in tabulis 
    nostri familiares, sed etiam in poculis et in anulis habent.

    Contra quos omnis dicendum breviter existimo. Quamquam philosophiae quidem 
    vituperatoribus satis responsum est eo libro, quo a nobis philosophia 
    defensa et collaudata est, cum esset accusata et vituperata ab Hortensio. 
    qui liber cum et tibi probatus videretur et iis, <!-- @todo Ici, je dois 
    trouver ce qui manque --> postulant in eo, quod semel admissum coerceri 
    reprimique non potest, ut propemodum iustioribus utamur illis, qui omnino 
    avocent a philosophia, quam his, qui rebus infinitis modum constituant in 
    reque eo meliore, quo maior sit, mediocritatem desiderent.

    if ( preg_match_all( '/<p>(.*?)<\/p>/si',$szStr,$matches ) )
        $szResult = "On a trouvé " . count( $matches[0] ) . " paragraphes.";
    else
        $szResult = "On n'a PAS trouvé de paragraphe";

... donne comme résultat :


On a trouvé 2 paragraphes.

Rechercher les occurrences de commentaires 'todo' dans un texte

Voilà un texte composé de 2 paragraphes latins et qui comporte un commentaire de type "TODO":


    Tum Pomponius: At ego, quem vos ut deditum Epicuro insectari soletis, sum 
    multum equidem cum Phaedro, quem unice diligo, ut scitis, in Epicuri hortis, 
    quos modo praeteribamus, sed veteris proverbii admonitu vivorum memini, nec 
    tamen Epicuri licet oblivisci, si cupiam, cuius imaginem non modo in tabulis 
    nostri familiares, sed etiam in poculis et in anulis habent.

    Contra quos omnis dicendum breviter existimo. Quamquam philosophiae quidem 
    vituperatoribus satis responsum est eo libro, quo a nobis philosophia 
    defensa et collaudata est, cum esset accusata et vituperata ab Hortensio. 
    qui liber cum et tibi probatus videretur et iis, <!-- @todo Ici, je dois 
    trouver ce qui manque --> postulant in eo, quod semel admissum coerceri 
    reprimique non potest, ut propemodum iustioribus utamur illis, qui omnino 
    avocent a philosophia, quam his, qui rebus infinitis modum constituant in 
    reque eo meliore, quo maior sit, mediocritatem desiderent.

    if ( preg_match_all( '/<!-- @todo(.*?)-->/si',$szStr,$matches ) )
    {
        $szResult = "On a trouvé " . count( $matches[0] ) . " TODOs.\n";
        $iPara = 0;
        foreach( $matches[0] as $match )
        {
            $iPara++;

            $szResult .= "TODO #{$iPara}:\n";
            $szResult .= htmlentities( $match );
        }
    }
    else
    {
        $szResult = "On n'a <strong>PAS</strong> trouvé de TODO";
    }

... donne comme résultat :


On a trouvé 1 TODOs.
TODO #1:
<!-- @todo Ici, je dois trouver ce qui manque -->

Stuur uw eigen commentaar


(niet gepubliceerd)





Machine de turing




(*) verplicht veld.

Vermijd meerdere malen de knop “ Poster ” in te drukken. Het kan enkele seconden duren vooral u verwittigd wordt dat uw commentaar door de server in anmerking genomen werd.

Notes à propos des commentaires

We vragen u behoedzaam te zijn en de regels van wellevendheid te respecteren. Commentaren die niet gepast of kwetsend zijn kunnen gewijzigd of zelfs verwijderd worden.

De e-mail adressen die jullie achterlaten worden NOOIT getoond omwille van vertrouwelijkheid: zij dienen enkel om u te kunnen contacteren om een of ander punt te verduidelijken indien nodig.

Noteer dat alle HTML sleutelwoorden uit uw commentaren worden weggehaald. Niettemin kan u volgende labels gebruiken om uw tekst te formatteren:

  • [p] en [/p] : paragraph
  • [b] en [/b] : bold
  • [i] en [/i] : italic
  • [q] en [/q] : quote
  • [http] en [/http] : anchor
  • [pre] en [/pre] : preformatted tekst
  • [code] en [/code] : broncode

Dank u

< September 2010 >
Ma Di Wo Do Vr Za Zo
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30