begin process at 2012 05 29 01:51:23
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive PHP

 > 

Archives

 > 

AU SECOURS !!!

 > 

expression reguliere fort hardue!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

expression reguliere fort hardue!

mardi 18 octobre 2005 à 16:04:18 | expression reguliere fort hardue!

hansap

voila, ca fait un moment que j'essaie de resoudre ce probleme, j'ai
posté dans plusieurs forums, mias mon post le plus complet se trouve
ici :
http://www.developpez.net/forums/viewtopic.php?t=406330&start=15
si vous voulez bien m'aider... :)

pour reprendre la problemeatique :
(copier coller de mon post sur developpez.net)

j'ai créé, pour une action de BTS, un moteur de template.
une de ses fonctionnalitées est de substituer un "bloque" par "autre
chose" (pas important ici)
pour substituer ce block, je doit tout d'abord l'extraire, pour ce
faire, je fait un preg_match() qui me retourne mon block, je fait mes
traitemeznts, puis je fait un str_replace() pour substituer le nouveuax
block.

mon pb se situe au niveau du preg_match :
cette fonction accepte trois parametre.
L'un d'eux est une expression reguliere.

cette expression est :
"/<li>.*?\[ *testBDD *; *block *= *li *\].*<\/li>/sU"
pour simplifier, on peut la noter :
"/<li>.*?.*<\/li>/sU"

mon pb :

au lieu de prendre le dernier <li> disponible, elle prend le
premier...cad :
Code:

<li>  ne pas me prendre mias quand meme pris </li>
<li>  je veut cette partie </li>
<li>  ne pas me prendre et ca marche </li>

donnera :
Code:
<li>  ne pas me prendre mias quand meme pris </li>
<li>  je veut cette partie </li>

alors que je ne veut que :
Code:

<li>  je veut cette partie </li>

meric de votre aide svp ))

mardi 18 octobre 2005 à 17:12:10 | Re : expression reguliere fort hardue!

Anthomicro

Salut,

je ne comprends pas ton problème. Partons d'un fichier html, que veux-tu parser et retourner ? (ça sera plus simple à comprendre je pense)

a +


    mardi 18 octobre 2005 à 18:00:05 | Re : expression reguliere fort hardue!

    hansap

    conanit tu les moteur de template?
    je veut en faire un moi meme.
    cad :
    tu as deux parties:
    une page HTML (purement fixe)
    un script PHP (purement dynamique)

    a partir du script qui se debrouille pour recupérer des infos (requetes ou autre) tu fusionne les données dand ton template.

    cad :
    la ou tu n'avait qu'une balise [balise; client.nom]
    tu auras tous les noms de tes clients...

    dans mon pb :

    j'ai une balise [balise; block = li] suivit de balsies du type [balise; client .nom]
    pourquoi la rpemiere. car la ou il n'y avait qu'une seule balise, vont apparaitre plein de nom de client... faut bien savoir par ou les separer... et bien la le separateur (le "block") sera un <li>...</li>

    donc, a partir de tout mon fichier HTML chargé dans une varible chaine de caractere, je veut pouvoir retrouver <li> bla bla bla </li>

    et le bon...
    si tu n'a pas compris va sur :
    http://www.developpez.net/forums/viewtopic.php?t=406330&start=15
    stp :)  j'ai passé plusieurs post a expliquer le pourquoi du comment :))

    mardi 18 octobre 2005 à 18:20:22 | Re : expression reguliere fort hardue!

    J_G

    hansap => Connais tu le XLS ? Sorte de règle transformation des fichier XML (dont HTML fait parti)...



    Tu écrit ta règle XLS, Tu colle ton XML dans une moulinette sous l'égide du XLS. Il en ressort un nouveau XML...



    Sinon, je suis comme Antho : problème de compréhension, même en allant voir sur developpez.net.

    Pour isoler le contenu des <li> ici </li> :
    $matches= array();
    preg_match_all("@<li>((\w|\s)*)</li>@", $matches, $text_html);
    echo nl2br(print_r($matches,true));


    Autrement, je te propose tout ça :


    L'ordre est tel que $matches[0] est un tableau qui contient les résultats qui satisfont le masque complet, $matches[1] est un tableau qui contient les résultats qui satisfont la première parenthèse capturante, etc.

    Exemple 1. Exemple avec preg_match_all() et PREG_PATTERN_ORDER

    <?php
    preg_match_all
    ("|<[^>]+>(.*)</[^>]+>|U",
                    
    "<strong>exemple : </strong><div align=\"left\">un test</div>",
                    
    $out,
                    
    PREG_PATTERN_ORDER);

    echo
    $out[0][0] . ', ' . $out[0][1] . "\n";
    echo
    $out[1][0] . ', ' . $out[1][1] . "\n";
    ?>

    L'exemple ci-dessus va afficher :

    <strong>exemple : </strong>, <div align="left">un test</div>
    exemple : , un test

    Ainsi, $out[0] est un tableau qui contient les résultats qui satisfont le masque complet, et $out[1] est un tableau qui contient les balises entre > et <.

    PREG_SET_ORDER

    Les résultats sont classés de telle façon que $matches[0] contient la première série de résultats, $matches[1] contient la deuxième, etc.

    Exemple 2. Exemple avec preg_match_all() et PREG_SET_ORDER

    <?php
    preg_match_all
    ("|<[^>]+>(.*)</[^>]+>|U",
                    
    "<strong>exemple : </strong><div align=\"left\">un test</div>",
                    
    $out,
                    
    PREG_SET_ORDER);
    echo
    $out[0][0] . ', ' . $out[0][1] . "\n";
    echo
    $out[1][0] . ', ' . $out[1][1] . "\n";
    ?>

    L'exemple ci-dessus va afficher :

    <strong>exemple : </strong>, exemple : 
    <div align="left">un test</div>, un test

    Dans ce cas, $matches[0] est la première série de résultat, et $matches[0][0] contient le texte qui satisfait le masque complet, $matches[0][1] contient le texte de la première parenthèse capturante, etc. De même, $matches[1] contient le texte qui satisfait le masque complet, etc.


    Exemple 4. Recherche les couples de balises HTML (gourmand)

    <?php
    // Cet exemple utilise les références arrières (\\2).
    // Elles indiquent à l'analyseur qu'il doit trouver quelque chose qu'il
    // a déjà repéré un peu plus tôt
    // le nombre 2 indique que c'est le deuxième jeu de parenthèses
    // capturante qui doit être utilisé (ici, ([\w]+)).
    // L'antislash est nécessaire ici, car la chaîne est entre guillemets doubles

    $html = '<strong>Texte en gras</strong><a href="salut.html">clique moi</a>';

    preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);

    foreach (
    $matches as $val) {
       echo
    "matched: " . $val[0] . "\n";
       echo
    "part 1: " . $val[1] . "\n";
       echo
    "part 2: " . $val[3] . "\n";
       echo
    "part 3: " . $val[4] . "\n\n";
    }
    ?>

    L'exemple ci-dessus va afficher :

    Trouvé : <strong>Texte en gras</strong>
    partie 1 : <strong>
    partie 2 : Texte en gras
    partie 3 : </strong>

    Trouvé : <a href="salut.html">clique moi</a>
    partie 1 : <a href="salut.html">
    partie 2 : clique moi
    partie 3 : </a>

    mardi 18 octobre 2005 à 18:40:19 | Re : expression reguliere fort hardue!

    Anthomicro

    Merci je sais ce qu'est un moteur de template, et malgré ton post sur developpez.com je n'en comprends pas vraiment plus... m'enfin bon tant pis. Bon courage.

    a +


      mardi 18 octobre 2005 à 21:32:50 | Re : expression reguliere fort hardue!

      coucou747

      Administrateur CodeS-SourceS
      xslt est bien plus approprié pour ce genre de choses...

      In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

      [ Lien ]
      mercredi 19 octobre 2005 à 09:09:05 | Re : expression reguliere fort hardue!

      hansap

      bonjours J_G, j'ai lut avec une (tres) grande attention tout ce que tu m'a dit, mais avant tout, je vait essayer d'exposer un pb tres simple :

      je fait :
      <?
      $chaine = "
       <li>  ne pas me prendre mais quand meme pris </li>
       <li>  je veut cette partie </li>
       <li>  ne pas me prendre et ca marche </li> ";
      preg_match("/<li>.*je veut cette partie.*<\/li>/sU", $chaine, $occurence);
      var_dump($occurence);
      ?>
      et j'obtient :
      array(1) {   [0]=&gt;   string(86) "<li>  ne pas me prendre mias quand meme pris </li>   <li>  je veut cette partie </li>" }

      donc, la ou je ne devrait avoir que la ligne du milieu, j'aen ai deux...
      bug de preg_match?

      Je pense donc etre en presence d'un bug... je suis en php 4.2.3, qi kkun pouvait essayer de reproduire ce petiti code pour moi...
      merci anthomicro, j'ai ete un peu sec, dsl...
      et coucou747 (ainsi que J_G) pensez vous que ce pourrait etre faisable de facon claire et conscise avec XSLT?
      je presente ca pour une action BTS, et la presentation doit primer sur l'optimisation, je pense...


      mercredi 19 octobre 2005 à 09:51:55 | Re : expression reguliere fort hardue!

      malalam

      Administrateur CodeS-SourceS
      Hello,

      je peux ?
      Hansap, je ne comprends pas moin non plus complètement. Tu as 3 balises <li>, et tu veux le contenu de la seconde, dans ton dernier exemple...?

      Quelle est la règle pour ton moteur ? Tu dois avoir des spécs, je suppose, donne les.

      Ensuite...html, ça vient du sgml. xml aussi. xhtml aussi, donc.
      Bref, la seule différence notable entre le html, et xml, c'est qu'html n'est pas sensible à la casse, xml si.
      Mais la structure es la même.

      Donc, quand je lis que xslt peut t'apporter une solution...je soutiens :-) Mais tu n'as peut-être pas besoin de passer par xslt.
      En fait ce qui devrait t'intéresser, c'est XPath. Tu peux 'en servir dans un fichier xsl...c'est pratique, et efficace. TU accèdes au noeud que tu veux, à sa valeur, attribut, tu peux boucler sur tes noeuds etc...si tu veux le 3ème <li> sur une liste de deux, ça va te prendre 1 ligne en XPath.
      Et en plus, tu peux 'en servir directement avec php.
      Cherche XPath, XSLT, sur le web, et XPath sur php.net aussi.



      mercredi 19 octobre 2005 à 09:56:38 | Re : expression reguliere fort hardue!

      malalam

      Administrateur CodeS-SourceS
      Quant à ton expression régulière (j'ai oublié entre temps lol), ce n'est pas un bug de preg_match, mais ton expression qui est fausse.

      <?php
      $chaine = "
       <li>  ne pas me prendre mais quand meme pris </li>
       <li>  je veut cette partie </li>
       <li>  ne pas me prendre et ca marche </li> ";
      preg_match("/<li>*[je veut cette partie]*<\/li>/sU", $chaine, $occurence);
      var_dump($occurence);
      ?>

      mercredi 19 octobre 2005 à 10:01:28 | Re : expression reguliere fort hardue!

      hansap

      JG :
      Pour isoler le contenu des <li> ici </li> :
      $matches= array();
      preg_match_all("@<li>((\w|\s)*)</li>@", $matches, $text_html);
      echo nl2br(print_r($matches,true));

      effectivement, ca marche, cependant, tu travail sur un char unique : (\w|\s)*  qui se repete tantque pas </li>  (bizarre, ici y'a pas a echapper le "/"... un effet des "@"?? )

      je pourrait essayer de fonctionner avec qqchose du genre de ((?!maChaine)|\w|\s)  mais jusqu'a present... ca marche pas...
      merci de ta piste...

      1 2

      Cette discussion est classée dans : prendre, expression, reguliere, block, mias


      Répondre à ce message

      Sujets en rapport avec ce message

      Expression reguliere [ par wonesek ] $mois = array( "01" => "Janvier", "02" => "Fevrier", "03" => "Mars", "04" => "Avril", "05" => "Mai", "06" => "Juin", "07" => "Juillet", "08" => expression reguliere [ par wonesek ] bonsoir tout le monde j'ai actullement un petit probleme avec une expression reguliere PCRE:code source------------------$a = "[a]1[/a][a]2[/a]";preg_ expression reguliere [ par Rochon ] Avec les expressions regulière je voudrait que tout les mots print et if qui sont entre des balises et soient surlignés:j'utilisent: $t expression reguliere pour balise HTML [ par nezdeboeuf62 ] Bonjour tout le monde,Voila j'aurais voulu savoir si quelqu'un connaissait une regexp pour decrire une balise HTML. En fait plus précisément il m'en f Expression reguliere [ par pioug70 ] Bonjour, Je suis null en expression reguliere je cherche a faire simplement cela Dans une variable contenant un fichier html je veux resortir un table expression reguliere : formaliser ()* [ par aekold ] Bonjour les phpseniens,je reste bloqué sur probleme dont je ne comprend pas la raison. Je vous explique a travers un exemple mon souci:objectif : récu expression reguliere !!! [ par kangoo75 ] bonjour à tous Connaitrez vous une expression reguliere qui permettrait de savoir si ce qui est rentré est sois un nombre flottant (ex : 2.6 ou 0.2 ) expression reguliere? [ par kangoo75 ] bonjour à tous Connaitrez vous une expression reguliere qui permettrait de savoir si ce qui est rentré est sois un nombre flottant (ex : 2.6 ou 0.2 ) expression reguliere : image html vers bbcode [ par Full62 ] bonjour,je veut utiliser une expression reguliere pour convertir mon code html vers du bbcode mais cela ne fonctionne pas...voici ce que j'ai mis :// expression reguliere [ par David_monchy ] Salut, je voudrais employer une expression régulière, mais je suis nul dans ce domaine. Comment savoir si il y a les balises et les remplacer par aut


      Nos sponsors


      Sondage...

      CalendriCode

      Mai 2012
      LMMJVSD
       123456
      78910111213
      14151617181920
      21222324252627
      28293031   

      Consulter la suite du CalendriCode

      A découvrir



       
      Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
      CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
      CodeS-SourceS.com© est une marque déposée tous droits réservés

      Google Coop CodeS-SourceS Google Coop CodeS-SourceS
      Temps d'éxécution de la page : 0,452 sec (3)

      Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales