Articles web

Nos articles concernant les techniques web sont centrés sur des solutions pratiques qui mettent en œuvre, le plus souvent, notre framework web : Vae Soli!

Des articles généraux sont également fournis dans le respect des standards du web.

Tous nos articles web sont disponibles sous le couvert de la licence Icône Creative Commons Creative Commons — Paternité - pas de modification.

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

Ajoutez un nouveau commentaire


(non affichée)





Machine de turing




(*) Zone obligatoire.

Évitez d'enfoncer le bouton “ Poster ” plus d'une fois. Le traitement de votre commentaire peut prendre quelques secondes sur le serveur avant que vous ne soyez averti de sa prise en compte.

Notes à propos des commentaires

Nous vous demandons de bien vouloir faire diligence et de respecter les règles les plus élémentaires de bienséance. Les commentaires non appropriés ou offensants pourront être édités voire supprimés.

Les adresses email que vous pourriez nous laisser ne sont JAMAIS affichées par mesure de confidentialité : elles ne nous servent qu'à vous contacter pour éclaircir un point ou l'autre si besoin était.

Notez bien que toutes les balises HTML sont retirées de votre commentaire néanmoins vous pouvez utiliser les marques suivantes pour vous aider à formater votre texte :

  • [p] et [/p] : paragraphe
  • [b] et [/b] : gras (bold)
  • [i] et [/i] : italique
  • [q] et [/q] : citation
  • [http] et [/http] : ancre
  • [pre] et [/pre] : texte préformaté
  • [code] et [/code] : code source

Merci