繁体   English   中英

在文档中查找HTML字符串

[英]Finding HTML strings in document

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

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

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

现在,我只想获取<p>...</p>标签之间的所有内容,并希望使用Regex,因为源不是HTML文档。

不要使用正则表达式来分析HTML


相反,请使用HTML Agility Pack

例如:

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

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

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

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

除了XHTML自包含标记之外,RegEx匹配开放标记

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

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

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

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

详细说明原因:

虽然其他人已经表示你不应该使用正则表达式这样做,但是你的失败的原因是你的<p>标签之间有更多的HTML而你的排除>导致正则表达式不匹配。

@"(?is)<p>(?>(?:(?!</?p>).)*)</p>"

(?:(?!</?p>).)*在做一个先行后确保它不是<p></p>标记的一部分,一次匹配一个字符。

(?>...)是一个原子组 ; 它可以防止我们知道毫无意义的回溯。

(?is)是一种替代机制,用于指定匹配修饰符 - 在本例中为IgnoreCase和Singleline(后者以防在标记之间有换行符或回车符,这将是多余的,但您确实说它不是真正的HTML) 。

顺便说一下, <>在正则表达式中没有特殊含义,所以没有必要逃避它们。 事实上,在某些风格中你可以通过逃避它们来赋予它们特殊含义: \\<\\>表示“单词的开头”和“单词的结尾”。 但在.NET正则表达式中,反斜杠只是杂乱无章。

您要求它,但除非您控制100%的HTML生成,否则使用Regexp确实不这样做...

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/>去吧

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM