IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

php expression reguliere


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Points : 6
    Points
    6
    Par défaut php expression reguliere
    Bonjour,

    J'espère que je poste au bon endroit, c'est mon premier post. Bon voila, j'ai un projet d'application web dans lequel on utilise des templates qui sont utilisés pour l'affichage.
    donc un fichier template nommé layout.php

    A l'interieur de ce fichier on peut definir des blocs de ce genre:
    [%bblock nom_du_bloc %]
    ensuite je peut avoir un fichier editer.view.php dans lequel j'appel le layout définit. A l'interieur de editer.view.php je peux avoir aussi des blocs de ce genre:
    [%bblock nom_du_bloc %]
    --on met du javascritp ou du html ou tu texte ou les trois-->
    [%eblock%]
    les noms de bloc doivent correspondre dans les deux fichiers.

    l'idée est de parser le fichier layout.php et de remplacer tous les [%bblock nom_du_bloc %] par le contenu qui se trouve entre les blocs [%bblock nom_du_bloc %][%eblock%] se situant dans editer.view.php portant le même nom de blocs.

    J'ai utiliser les expression regulieres de cette facon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $pattern_central="[\w<>\.\/'\"=\s\[\]àù\$\^*\\\#();%]";
    $pattern="/\[%bblock \s*([\w]+)\s*%\](".$pattern_central.")\[%eblock%\]/i";
    Cela marche sauf qu'il prend le premier [%bblock] et le dernier [%eblock%] qui se trouve dans editer.view.php en incluant les autres [%bblock][%eblock%]. Au final, je n'ai pas plusieurs ligne de block mais une seule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    preg_match_all($pattern,"[%bblock d1%]<br><br><br>[%eblock%]" .
    		"[%bblock d2%]salut[%eblock%]" .
    		"[%bblock d3 %]<b>lit</b>* \#(); ] 100% % ['<a href='../lien'>lien</a>[%eblock%]" .
    		"[%bblock d4%]<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>[%eblock%]" .
    		"[%bblock d5%][toto][%eblock%]" 
    	   ,$blocks,PREG_SET_ORDER);
    résultat avec un var_dump($blocks) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    array
      0 => 
        array
          0 => string '[%bblock d1%]<br><br><br>[%eblock%][%bblock d2%]salut[%eblock%][%bblock d3 %]<b>lm</b>* \#(); ] 100 sd'['<a href='../hydro'>lien</a>[%eblock%][%bblock d4%]<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>[%eblock%][%bblock d5%][toto][%eblock%]' (length=244)
          1 => string 'd1' (length=2)
          2 => string '<br><br><br>[%eblock%][%bblock d2%]salut[%eblock%][%bblock d3 %]<b>lm</b>* \#(); ] 100 sd'['<a href='../hydro'>lien</a>[%eblock%][%bblock d4%]<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>[%eblock%][%bblock d5%][toto]' (length=221)
    j'ai le nom en indice 1 et le contenu de mon $2 qui contient les autres bblock et eblock.

    si j'enlève le % en fin de mon $pattern_central (ci dessus, plus haut)ca marche sauf que je ne peux plus utiliser de %, sinon il trouve que le caractère n'est pas prise en compte.
    essai sans le %:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    array
      0 => 
        array
          0 => string '[%bblock d1%]<br><br><br>[%eblock%]' (length=35)
          1 => string 'd1' (length=2)
          2 => string '<br><br><br>' (length=12)
      1 => 
        array
          0 => string '[%bblock d2%]salut[%eblock%]' (length=28)
          1 => string 'd2' (length=2)
          2 => string 'salut' (length=5)
      2 => 
        array
          0 => string '[%bblock d3 %]<b>lm</b>* \#(); ] 100 sd'['<a href='../hydro'>lien</a>[%eblock%]' (length=79)
          1 => string 'd3' (length=2)
          2 => string '<b>lm</b>* \#(); ] 100 sd'['<a href='../hydro'>lien</a>' (length=55)
      3 => 
        array
          0 => string '[%bblock d4%]<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>[%eblock%]' (length=73)
          1 => string 'd4' (length=2)
          2 => string '<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>' (length=50)
      4 => 
        array
          0 => string '[%bblock d5%][toto][%eblock%]' (length=29)
          1 => string 'd5' (length=2)
          2 => string '[toto]' (length=6)
    En gros c'est un système de ce genre que je veux faire à savoir:
    parser le fichier layout.php et de remplacer tous les [%bblock nom_du_bloc %] par le contenu qui se trouve entre les blocs [%bblock nom_du_bloc %][%eblock%] se situant dans editer.view.php portant le même nom de blocs.Que ce contenu soit du un melange de tag html,javascrip,css ou pas, et sans que je ne soit obligé d'eviter de saisir certains caractères

    Est-ce possible?

    Si je suis sur la mauvaise piste, indiquez moi le bon chemin.
    S'il y a une autre façon de gérer ce genre de script (a savoir remplacer une balise par le contenu d'une autre, enfin un truc de ce genre), plus simplement, je suis preneur.

    C'est en php.

    Merci d'avance

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Bonjour,

    pour éviter de récupérer du premier [%bblock%] jusqu'au dernier [%eblock%] de ta chaine du fichier layout, il ne faut pas essayer de t'appuyer sur une classe de caractère (ta variable $pattern_central) puisque tu veux récupérer n'importe quoi situé entre les [%bb... et [%eb... les plus proches.

    Par contre, tu dois prendre garde à la gloutonnerie naturelle des quantificateurs + et * qui cherchent systématiquement la correspondance la plus grande. C'est pour ça que tu te retrouves avec un résultat allant du 1er [%bb... jusqu'au dernier [%eb...
    Pour enrayer le phénomène, tu dois les rendre non gloutons soit en mettant un ? après chaque quantificateur à dégloutonniser (*? ou +?), soit en utilisant le modificateur U en fin de pattern pour l'ensemble des quantificateurs. Ainsi, ils s'arrêteront à la plus petite correspondance.

    Je ferais comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $layout = <<<LOD
        [%bblock d1%]<br><br><br>[%eblock%]
        [%bblock d2%]salut[%eblock%]
        [%bblock d3 %]<b>lit</b>* \#(); ] 100% % ['<a href='../lien'>lien</a>[%eblock%]
        [%bblock d4%]<b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>[%eblock%]
        [%bblock d5%][toto][%eblock%]
    LOD;
     
    $pattern = '/\[%bblock\s(\w+)\s?%](.+)\[%eblock%]/sU';
     
    preg_match_all($pattern, $layout, $match); // $match[1] contient les premières parenthèses capturantes et $match[2] les 2ndes
     
    $result = array_combine($match[1], $match[2]);
    Comme ça j'obtiens directement un tableau associatif facile à manipuler avec le nom du bloc en clef et son contenu en valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $result = array
    (
        [d1] => <br><br><br>
        [d2] => salut
        [d3] => <b>lit</b>* \#(); ] 100% % ['<a href='../lien'>lien</a>
        [d4] => <b>lm</b>* \#(); 100 ] <a href='../hydro'>lien</a>
        [d5] => [toto]
    );
    Reste plus qu'à effectuer le remplacement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $editerView = file_get_contents('editer.view.php');
     
    $callback = function ($match) use ($result) { return $result [$match[1]]; };
     
    $finalResult = preg_replace_callback($pattern, $callback, $editerView);

Discussions similaires

  1. [RegEx] Expressions regulieres PHP
    Par ouss747 dans le forum Langage
    Réponses: 4
    Dernier message: 22/12/2010, 17h20
  2. expression reguliere php
    Par hamzawii dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2010, 17h08
  3. [MySQL] expression reguliere dans php
    Par juzii dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/02/2009, 22h43
  4. expression reguliere php, balise entrelassé
    Par neril dans le forum Langage
    Réponses: 5
    Dernier message: 26/06/2006, 20h28
  5. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo