2010-08-17 7 views
1

D'abord, je ne suis pas un expert en regex, donc je suis presque sûr de faire quelque chose de mal.Quel est le problème avec cette regex?

Voici mon expression régulière:

<(list)(\b[^>]*)>(<\1\b[^>]*>.*?<\/\1>|.)*?<\/\1> 

Ceci est la chaîne d'entrée:

... 
<list title="Lorem ipsum dolor sit amet, consectetur adipiscing elit..."> 
<li> 
    <list title="Lorem adipiscing..."> 
     <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit</li> 
     <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit</li> 
    </list> 
</li> 
<li> 
    <list title="Lorem ipsum..."> 
     <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit</li> 
    </list> 
</li> 
<li>Lorem ipsum dolor sit amet, consectetur adipiscing elit 
</li> 
<li>Lorem ipsum dolor sit amet, consectetur adipiscing elit 
</li> 
</list> 
... 

Je veux correspondre à la <list> externe et attraper tout le contenu, y compris la intertal <list> mais lorsque je tente pour lire le groupe \3 est vide, bien que les groupes \1 et \2 vont bien.

Toutes les idées seraient très appréciées.

+12

Le problème avec votre expression régulière est que vous l'utilisez pour analyser HTML. – cletus

+3

Pour clarifier la réponse de Cletus (qui est la bonne réponse pour cette question): http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Borealid

+3

... maintenant vous avez * deux * problèmes./puisque nous faisons ressortir les clichés. – dmckee

Répondre

6

Ce problème ne peut pas être résolu avec une correspondance d'expression régulière. Sérieusement. Je ne répète pas simplement le dogme «ne pas analyser le HTML avec regex»; les expressions régulières sont logiquement incapables de gérer les étiquettes imbriquées (pourquoi tout le monde dit "ne pas analyser HTML avec regex")

La meilleure idée que je peux vous donner est d'utiliser un analyseur XML. Si vous insistez pour résoudre ce problème en utilisant des expressions régulières, vous finirez par écrire votre propre analyseur récursif-descente, de sorte que vous pourriez aussi profiter du travail déjà effectué par d'autres sur ce problème.

+0

Merci d'avoir pris le temps de ne pas simplement dire "vous ne pouvez pas". – Freddy

+0

Vous êtes les bienvenus ... vous ne sembliez pas être convaincu par les commentaires, alors j'ai pensé qu'un peu d'explication pourrait aider. –

Questions connexes