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 :

Problème récursif avec regex [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 117
    Par défaut Problème récursif avec regex
    Bonjour,
    j'ai un petit projet de gestion de favoris en lignes : http://www.tp74.net/
    Et je veux que les utilisateur puisse importer leur favoris de leur navigateur web (forma html standard utiliser par IE opera Safarie firefox ect ...) en savoir plus ICI
    Donc il faut analyser la page html et j'utilise regex pour extraire je ne sais comment ^^ l'arborescence des dossiers et des favoris.
    Alors j'ai fait un esquisse de code pour une première approche
    PS: je sais pas trop par quel bout mit prendre ....
    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
    function decoupagehtml($file)
    {
    	$match = null;
    	$str = null;
    	preg_match_all("|<DL>(.*)</DL>|isU",$file,$match);
    	foreach ($match[0] as $str)
    	{
    		if (substr_count($str,'<DL>') > 0)
    		{decoupagehtml($str);}
    	}
    }
    $url = "http://127.0.0.1/tp74.net/ajax_test/ajoutexterne/bookmarks.html";
    $file = file_get_contents($url);
    $match = null;
    decoupagehtml($file);
    Evidament ce code ne marche pas ... je suis confronté un problème terrible !!!
    le code génère une boucle infini puisque les '<DL>' ne se supprimer pas la grande question est Comment supprimer le premier et QUE le premier '<DL>'

    merci d'avance pour vaux réponses cordialement vinc.

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 117
    Par défaut
    j'ai fait un test le premier problème n'est pas de syntaxe mais d'algorithme.
    j'ait fait un test avec un page html simple voici l'image et j'ai mit en couleur ce que le script devrai être capable de faire.

    http://www.tp74.net/images/apercu/test.png

    cepandent le code géner ce qui est normal quelque chose comme sa
    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
    tableau : <pre><fieldset>Array
    (
        [0] => <DL><p> 
        <DT><H3 ADD_DATE="1231959008" LAST_MODIFIED="1231959103">dossier1</H3> 
        <DL><p> 
            <DT><H3 ADD_DATE="1231959083">sous dossier 1</H3> 
            <DL><p> 
            </DL> 
        [1] => <DL><p> 
                <DT><A HREF="http://www.fcdv.de/" ADD_DATE="1231959050" LAST_MODIFIED="1231959050" ICON_URI="http://www.fcdv.de/favicon.ico" ICON="" LAST_CHARSET="ISO-8859-1">Dachverein BSV Kickers Emden</A> 
    <DD> 
            </DL> 
        [2] => <DL><p> 
        </DL> 
        [3] => <DL><p> 
            <DT><A HREF="place:sort=8&maxResults=10">Les plus visités</A> 
            <DT><A HREF="http://fr.www.mozilla.com/fr/firefox/central/" ADD_DATE="1227553446" LAST_MODIFIED="1227553446" ICON_URI="http://fr.www.mozilla.com/favicon.ico" ICON="">Débuter avec Firefox</A> 
            <DT><A FEEDURL="http://fr.fxfeeds.mozilla.com/fr/firefox/headlines.xml" HREF="http://www.lemonde.fr/">À la une</A> 
        </DL> 
    )
    <pre></fieldset>
    j'avoue que je cal un peut je continu à chercher je vous fait par des mes avancements si y-an a .

    si vous avez des idées n'hésité pas

    cordialement.
    vinc

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 117
    Par défaut
    Voila je répond encore a mon propre sujet apret une long discutions sur le tchat avec LogistiX
    Voici ou en est l'algorytme dsl j'ai plus trop le temps de rédiger je le ferait demain vert 7heur

    on détecte comme précédent les <DL></DL>
    est si y'a un <DT> sans <DL> avant on utilise le comportement récursif en tout logic sa devrait marcher reste plus qu'a developpez*

  4. #4
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    A ta place, je passerais par un "vrai" parser html. DOM, simplexml, xmlreader... Ca me parait plus adapté

  5. #5
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 32
    Par défaut
    Citation Envoyé par goodpz Voir le message
    A ta place, je passerais par un "vrai" parser html. DOM, simplexml, xmlreader... Ca me parait plus adapté
    Le document n'est pas XML-valide. Est-ce que les produits suscités vont s'y retrouver ? (je ne suis pas spécialiste en la matière, et du coup bien plus porté sur la solution récursive...)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par spy74 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      preg_match_all("|<DL>(.*)</DL>|isU",$file,$match);
    Une regex récursive sur match aurait une tête dans ce style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <pre>
    <?php
     
    $html = 'avant<dl><p>
    salut<dl><p>
    bonjour</dl>toujour</dl>après';
     
    preg_match('#<dl>(?:[^<]|<(?!/?dl>)|(?R))+</dl>#i', $html, $dl);
     
    echo htmlentities($dl[0]);
     
    ?>
    </pre>
    Mais sur des données conséquentes, une regex récursive se heurtera aux limites de stack et/ou de backtrack de PCRE. Et de toutes manières, il faudrait encore du code pour extraire les imbrications de <DL>...</DL>

    Alors une récursion PHP sur preg_split devrait faire ton bonheur. Je ne suis pas tout à fait certaine de la structure finale désirée pour la hiérarchie.
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    <pre>
    <?php
     
    function dl_bookmarks(&$array, $start=true, $title=0)
    {
      static $regex_dir = '@>([^<>]+)</H3>@i';
      static $regex_ref = '@HREF="([^"]+)"[^>]+>([^<>]+)</A>@i';
      static $i,$j = null;
     
      if ($start) {
        $i = 0;
        $j = count($array);
      }
      else ++$i;
     
      $titles = array();
      for (; $i<$j; ++$i) {
        $snippet = $array[$i];
        if ($snippet == '</DL>') break;
        else if ($snippet == '<DL>') {
          // Imbrication Récursive
          // forme [Titre Dossier] = array()
          $titles[$title] = dl_bookmarks($array, false, $title);
        }
        else {
          if (preg_match($regex_dir, $snippet, $match)) {
            // Récupérer Titre du Dossier
            // sous forme [Titre Dossier] = array() via récursivité
            $title = $match[1];
          }
          if (preg_match_all($regex_ref, $snippet, $match)) {
            // Récupérer Titre et HREF du Site sous forme [Titre Site] = HREF
            foreach ($match[0] as $idx => $data) {
              $titles[$match[2][$idx]] = $match[1][$idx];
            }
          }
        }
      }
      return $titles;
    }
     
    function netscape_bookmarks($html)
    {
      $options = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY;
      $snippets = preg_split('@(</?DL>)@i', $html, -1, $options);
      $bookmarks = dl_bookmarks($snippets); // en récursion
      return $bookmarks[0];
    }
     
    $file = 'bookmarks.html';
    $html = file_get_contents($file);
    $bookmarks = netscape_bookmarks($html);
     
    print_r($bookmarks);
     
    ?>
    </pre>

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 117
    Par défaut
    Bonjour,
    Merci infiniment Tisha Carpenter pour code ton qui fonctionne a merveille .
    On dirait que ta déjà été confronté a ce genre de problème d'importation de favoris ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec regex non trouvé
    Par Damien69 dans le forum Langage
    Réponses: 3
    Dernier message: 31/08/2008, 13h32
  2. problème avec regex
    Par mhamedbj dans le forum Langage
    Réponses: 11
    Dernier message: 15/04/2007, 12h15
  3. problèmes avec Regex sous c#
    Par santana2006 dans le forum C#
    Réponses: 2
    Dernier message: 24/01/2007, 15h42
  4. Problème avec Regex
    Par trihanhcie dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/07/2006, 14h50
  5. Problème avec RegEx et une Query string
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 15h48

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