Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    mai 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : mai 2012
    Messages : 1
    Points : 0
    Points
    0

    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 :
    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 :
    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 :
    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 :
    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
    Membre éclairé Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 264
    Points : 358
    Points
    358

    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 :
    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 :
    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 :
    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);

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •