【问题标题】:Finding HTML strings in document在文档中查找 HTML 字符串
【发布时间】:2010-01-20 16:38:50
【问题描述】:

我想在一个文档中获取所有 HTML <p>...</p>
使用Regex 查找所有此类字符串:

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

但我无法得到任何结果。我的正则表达式有什么问题吗?

现在,我只想获取 &lt;p&gt;...&lt;/p&gt; 标记之间的所有内容,并希望为此使用正则表达式,因为源不是 HTML 文档。

【问题讨论】:

  • 找不到的文字。

  • 如果您仍然不在乎会忽略父 p 标签内的所有 p 标签,则将文本“([^\>]*)”替换为“(.*)”。这将匹配标签中的所有字符。请注意,您不会使用此方法匹配所有 p 标签。

标签: c# .net html regex


【解决方案1】:

DO NOT PARSE HTML USING Regular Expressions!!!


改为使用HTML Agility Pack

例如:

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

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

编辑:即使文档实际上不是 HTML,您也可以这样做。

【讨论】:

  • 我喜欢链接的答案如何成为模因。
  • 这个话题的持续性让我惊讶不已。以及如何轻松获得 90+ 代表...... :-)
  • 在达到上限之前,我实际上只从这个答案中获得了 55 个代表。
【解决方案2】:

为此使用正则表达式并不是最好的主意。我建议阅读这个帖子:

RegEx match open tags except XHTML self-contained tags

【讨论】:

    【解决方案3】:

    使用正则表达式匹配 HTML 元素的方法注定要失败。正则表达式不能可靠地匹配 HTML 元素。可以构建比您的正则表达式匹配的更复杂的 HTML 元素。

    例如,我可以用以下方式击败你的正则表达式

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

    您需要使用 HTML(或可能的 XML)解析器/DOM,而不是使用正则表达式。这是可靠地查询 HTML 文件的唯一方法

    详细解释原因:

    【讨论】:

      【解决方案4】:

      虽然其他人说您不应该使用正则表达式执行此操作,但您失败的原因是您的 &lt;p&gt; 标记之间有更多 HTML,而您排除 &gt; 导致正则表达式不匹配.

      【讨论】:

      • 我只想获取

        ...

        标签之间的所有内容。什么是正确的正则表达式?
      • @inutan -- 没有一个可以 100% 工作的。请参阅 JaredPar 的帖子。
      【解决方案5】:
      @"(?is)<p>(?>(?:(?!</?p>).)*)</p>"
      

      (?:(?!&lt;/?p&gt;).)* 一次匹配一个字符,在执行前瞻以确保它不属于 &lt;p&gt;&lt;/p&gt; 标记之后。

      (?&gt;...) 是一个atomic group;它可以防止我们知道毫无意义的回溯。

      (?is) 是指定匹配修饰符的另一种机制——在这种情况下,IgnoreCase 和 Singleline(如果标签之间存在换行符或回车符,则后者是多余的,但您确实说过这不是真的HTML)。

      顺便说一句,&lt;&gt; 在正则表达式中没有特殊含义,因此无需转义它们。事实上,在some flavors 中,您可以通过转义它们赋予特殊含义:\&lt;\&gt; 分别表示“词的开头”和“词的结尾”。但在 .NET 正则表达式中,反斜杠只是杂乱无章。

      【讨论】:

        【解决方案6】:

        您要求它,但除非您控制 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>"
        

        所以如果你确定没有&lt;p/&gt;,那就去吧

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-22
          相关资源
          最近更新 更多