Поиск строк HTML в документе - PullRequest
3 голосов
/ 20 января 2010

Я хочу получить весь HTML <p>...</p> в документе.
Используя Regex, чтобы найти все такие строки, используя:

Regex regex = new Regex(@"\<p\>([^\>]*)\</p\>", RegexOptions.IgnoreCase);

Но я не могу получить никакого результата.Что-то не так с моим регулярным выражением?1010 *

Ответы [ 6 ]

18 голосов
/ 20 января 2010

НЕ парсировать HTML с использованием регулярных выражений !!!


Вместо этого используйте HTML-пакет Agility Pack .

Например:

var doc = new HtmlDocument();
doc.Load(...);

var pTags = doc.DocumentNode.Descendants("p");

РЕДАКТИРОВАТЬ : Вы можете сделать это, даже если документ не является HTML.

2 голосов
/ 20 января 2010

Использование регулярных выражений для этого не лучшая идея. Предлагаю прочитать эту ветку:

RegEx соответствует открытым тегам, кроме автономных тегов XHTML

1 голос
/ 20 января 2010
@"(?is)<p>(?>(?:(?!</?p>).)*)</p>"

(?:(?!</?p>).)* соответствует одному символу за раз, после того как мы проверили, что он не является частью тега <p> или </p>.

(?>...) представляет собой атомную группу ; это предотвращает возврат назад, который, как мы знаем, был бы бессмысленным.

(?is) - это альтернативный механизм для указания модификаторов соответствия - в этом случае IgnoreCase и Singleline (последний в случае, если между тегами есть перевод строки или возврат каретки, что будет избыточным, но вы действительно сказали, что это не совсем так. HTML).

Кстати, < и > не имеют особого значения в регулярных выражениях, поэтому нет необходимости избегать их. Фактически, в некоторых разновидностях вы можете придать им особые значения, избегая их: \< и \> означают «начало слова» и «конец слова» соответственно. Но в регулярных выражениях .NET обратные слеши просто беспорядочные.

1 голос
/ 20 января 2010

В то время как другие говорили, что вы не должны делать это с регулярными выражениями, причина вашего сбоя в том, что между вашими тегами <p> больше HTML, а исключение > приводит к тому, что Regex не соответствует .

1 голос
/ 20 января 2010

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

Например, я могу побить ваше регулярное выражение следующим

<p>hello<p>again</p></p>

Вместо использования регулярных выражений вам нужно использовать анализатор HTML (или, возможно, XML) / DOM. Это единственный способ надежно запросить HTML-файл

Подробное объяснение почему:

0 голосов
/ 20 января 2010

Вы просили об этом, но на самом деле не делаете этого с помощью регулярных выражений, если не контролируете 100% производства HTML ...

public static Regex regex = new Regex(
      "(?<open>\\<p(?<attr>[^>])*\\>)(?<content>.*)\\</p(?:\\s*)\\>",
    RegexOptions.Multiline
    | RegexOptions.CultureInvariant
    | RegexOptions.Compiled
    );

проверено против

<p>hello world</p>
<p style="Foo"></p >
<p>who nests paragraphs <p>in 2010?</p> </p  >
<p /><p><a href="http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454">TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ</a></p><p/>

приведет к содержанию группы

"hello world"
""
"who nests paragraphs <p>in 2010?</p>"
"<p><a href="http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454">TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ</a>"

так что если вы уверены, что нет <p/>, сделайте это

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