C # регулярное выражение для поиска форм с тегами ввода в HTML? - PullRequest
1 голос
/ 05 мая 2010

У меня есть простая проблема: я хочу создать регулярное выражение, соответствующее форме в HTML, но только если у формы есть какие-либо входные теги. Пример:

Должно совпадать следующее (игнорируя атрибуты):

..
<form>
..
<input/>
..
</form>
..

Но следующее не должно (игнорируя атрибуты):

..
<form>
..
</form>
..

Я перепробовал все, от осмотра до захвата групп, но это быстро усложняется. Я хочу верить, что есть простое регулярное выражение для решения проблемы. Обратите внимание, что важно, чтобы регулярное выражение связывало открывающий и закрывающий теги в соответствии с HTML-кодом, что означает, что следующее не работает:

<form>.+<input/>.+</form>

потому что он неверно соответствует этому:

..
<form> <--- This is wrongly matched as the opening tag 
..
</form> 
<form> <-- This is the correct opening tag of the correct form
..
<input/>
..
</form> <--- This is matched as the closing tag
..

EDIT:

Я уже создал RegEx, который соответствует тому, что я хочу; мой вопрос сейчас, как это сделать, но как это сделать ПРОСТО / элегантно. Для меня это совсем не просто и не элегантно:

<form>
(.(?<!</form>))+
<input/>
(.(?<!</form>))+
</form>

Ответы [ 4 ]

5 голосов
/ 05 мая 2010

Я хочу верить, что есть простое регулярное выражение для решения проблемы

Желающий так не делает. Нет никаких доказательств для предположения, что каждая проблема может быть решена с помощью регулярных выражений, и множество доказательств против Ваша вера не в лучшем положении.

Множество языков, распознаваемых регулярными выражениями, называется - что неудивительно - регулярными языками. Хорошим свойством всех обычных языков является то, что они могут распознаваться устройством с конечным числом состояний. Таким образом, вы можете быстро выяснить, является ли язык не регулярным, задав себе вопрос: «Мне бы потребовалось неограниченное количество состояний для распознавания этого языка?»

Рассмотрим язык совпадающих слов: (), () (), (()), () (()) и т. Д. Чтобы распознать этот язык, вы должны отслеживать, сколько открытых паренов ожидают закрытия, и поэтому вам нужно неограниченное количество состояний. Поэтому этот язык не является регулярным языком, и поэтому ему не может соответствовать регулярное выражение.

HTML, безусловно, является родственным языком, но еще более сложным, потому что теперь существует бесконечное количество различных «видов паренов». Каждый тег подобен открытому пареню, которому должен соответствовать соответствующий закрывающий тег. Поскольку это еще более сложная и трудная версия нестандартного языка, очевидно, что он не может быть обычным языком. И поэтому он не может быть правильно сопоставлен с регулярными выражениями.

Правильный инструмент для распознавания шаблонов в HTML - это анализатор HTML.

2 голосов
/ 05 мая 2010

Вы действительно не хотите анализировать HTML с помощью RegEx. См. этот ответ , если вам нужно больше убедительности.

Регулярные выражения - это неправильный инструмент для попытки анализа HTML, особенно если это HTML, который не гарантированно хорошо сформирован.

Вы действительно должны получить библиотеку разбора HTML / XHTML и использовать ее для соответствия HTML-содержимому. Взгляните на HTML Agility Pack , вероятно, этого достаточно для того, что вам нужно.

0 голосов
/ 05 мая 2010

Вы должны не анализировать HTML с помощью регулярных выражений , но если вам нужно, то как насчет чего-то простого:

<form>[^</form>]+<input/>.+</form>
0 голосов
/ 05 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...