2009-09-22 8 views
1

J'essaie d'écrire une regex qui correspond à la première étiquette de forme de fin.Regex pour correspondre à la première étiquette HTMl de fin

<form.*name="loginForm".*>[^~]*</form> 

Le regex ci-dessus correspond à la seconde extrémités de la ligne jusqu'à iE 8. mais je veux une expression régulière qui correspond à la fin immédiate de l'étiquette dans l'exemple ci-dessous, il doit correspondre à la ligne 5.

<html> 
<body> 
<form method = "post" name="loginForm" > 
<input type="text" name="userName"/> 
</form> 
<form method = "post" name="signupForm" > 
<input type="text" name="userName"/> 
</form> 
</body> 
</html> 
+0

Merci pour la réponse rapide et la suggestion. J'ai trouvé ma réponse. Un merci spécial à Guffa. –

Répondre

3

Utilisez un analyseur réel comme DOMDocument, SimpleXML ou SimpleHTMLDOM. Les expressions régulières ne sont pas adaptées à l'analyse de langages non réguliers tels que HTML.

+3

+1 Allais le dire, mais je devais rendre la question présentable en premier. Laissons le lien à l'explication de pourquoi (http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-parse-xml-and-html- with-a-rege) et l'exemple des parseurs (http://stackoverflow.com/questions/773340/can-you-provide-an-example-of-parsing-html-with-your-favorite-parser) pour l'exhaustivité . –

+1

Une expression régulière fonctionne très bien pour analyser une chaîne comme celle-ci. Il n'est définitivement pas nécessaire que ce soit une langue régulière pour être analysée par une expression régulière. – Guffa

2

Vous ne devriez pas utiliser des expressions régulières, mais analyser avec DOM:

Javascript:

var forms = document.getElementsByTagName('form'); 
forms[0] // is the first form element. 

PHP:

$dom = new DOMDocument(); 
$dom->loadHTML($html); 
$forms = $dom->getElementsByTagName('form'); 
$first = $forms->item(0); // reference to first form 

Vous pouvez utiliser minidom et ElementTree pour Python.

8

Juste faire le motif non gourmand afin qu'elle corresponde à la plus petite quantité possible de caractères au lieu de la plus grande possible:

<form[^>]*name="loginForm"[^>]*>[^~]*?</form> 

Edit:
Changé .*-[^>]* dans la balise de forme, de sorte que ne correspond pas à l'extérieur de l'étiquette.

+4

Échec des balises imbriquées. Je ne suis pas sûr que les formes seront imbriquées, mais utiliser une regex pour analyser HTML est toujours une mauvaise idée, même si cela fonctionne dans certains cas. –

+0

@Guffa: Alors vous devriez rendre tous les quantificateurs non gourmands. – Gumbo

+0

La question n'a pas demandé la balise de forme correspondante, elle a demandé le premier, ce qui pourrait ne pas être la meilleure chose à faire, mais c'est une astuce valide et utile parfois. –

Questions connexes