[英]Finding HTML strings in document
我想在文档中获取所有HTML <p>...</p>
。
使用Regex
查找所有此类字符串:
Regex regex = new Regex(@"\<p\>([^\>]*)\</p\>", RegexOptions.IgnoreCase);
但我无法得到任何结果。 我的正则表达式有什么问题吗?
现在,我只想获取<p>...</p>
标签之间的所有内容,并希望使用Regex,因为源不是HTML文档。
相反,请使用HTML Agility Pack 。
例如:
var doc = new HtmlDocument();
doc.Load(...);
var pTags = doc.DocumentNode.Descendants("p");
编辑 :即使文档实际上不是HTML,您也可以这样做。
使用正则表达式并不是最好的主意。 我建议阅读这个帖子:
使用正则表达式匹配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.