Регулярное выражение для соответствия с первым конечным тегом HTMl - PullRequest
2 голосов
/ 22 сентября 2009

Я пытаюсь написать регулярное выражение, соответствующее первому конечному тегу формы.

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

Вышеупомянутое регулярное выражение совпадает с точностью до секунды с конца, т.е. до строки 8. Но я хочу регулярное выражение, совпадающее с непосредственным окончанием тега в приведенном ниже примере, оно должно соответствовать строке 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>

Ответы [ 3 ]

9 голосов
/ 22 сентября 2009

Просто сделайте шаблон нежадным, чтобы он соответствовал минимально возможному количеству символов вместо максимально возможного:

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

Edit:
Изменено .* на [^>]* в теге формы, чтобы оно не совпадало вне тега.

3 голосов
/ 22 сентября 2009

Вы НЕ должны использовать регулярные выражения, но анализируйте их с помощью 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

Вы можете использовать minidom и ElementTree для Python.

3 голосов
/ 22 сентября 2009

Используйте настоящий анализатор, например DOMDocument , SimpleXML или SimpleHTMLDOM Регулярные выражения не подходят для анализа нерегулярных языков, таких как HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...