我正在尝试在C#中刮整个div元素...
我已经尝试过了, div class="txt-block"\s*(.+?)(\r\n?|\n)\s*"
但是它并没有刮擦整个:(有什么想法吗?
<div class="txt-block" itemprop="creator" itemscope itemtype="http://schema.org/Person">
<h4 class="inline">Writers:</h4>
<a href="/name/nm1318843/?ref_=tt_ov_wr" itemprop='url'><span class="itemprop" itemprop="name">Mark Fergus</span></a> (screenplay),
<a href="/name/nm1319757/?ref_=tt_ov_wr" itemprop='url'><span class="itemprop"
itemprop="name">Hawk Ostby</span></a> (screenplay), <a href="fullcredits?ref_=tt_ov_wr#writers" >6 more credits</a> »
</div>
Run Code Online (Sandbox Code Playgroud)
为什么要这么多否决票?因为您不会使用Regex解析HTML,所以不允许他吗?这是非常狭narrow的。
我已经看到很大一部分时间htmlagilitypack无法正确解析格式错误的html文档,或者无法解析大量捕获的串联或嵌套的HTML文档。否则,任何形式的XPath都不起作用,因为HTML文档是动态创建的,不一致的,并且不一定包含标识属性。当一个非常简单的正则表达式更可靠时,为什么还要导入额外的include并解决草率的标记呢?
如果您有一个大型项目,而该项目中的一个方法只需要提取输入HTML文档的DIV内容,该怎么办?它不是一个完整的HTML解析项目,只需要一个正则表达式即可。您的答案是包括更多导入,并为此构建一个全新的框架?我一年要做数百个项目。一半使用DOM / XPath,另一半根本不使用,并且需要Regex。
简而言之,不要那么狭narrow。参考XPath / DOM工具,但有助于回答问题。不要只是拒绝投票。我们不是尼安德特人,他们需要一直嘲笑一个古老的“永远不要用正则表达式解析HTML”一文。
答案如下:
一,单纯形:
(?s)<div.*?>(.*?)</div>
Run Code Online (Sandbox Code Playgroud)
需要一个特别命名的div吗?
(?s)<div[^>]*?class="txt-block"[^>]*?>(.*?)</div>
Run Code Online (Sandbox Code Playgroud)
是否希望节省CPU并避免不必要的回溯?
<div[^>]*?class="txt-block"[^>]*?>(([^<]*(?(?!</div>)<))*)</div>
Run Code Online (Sandbox Code Playgroud)
上面假设您没有嵌套的DIV项目。那就是不使用Regex的整个想法真正发挥作用的时候。除非您使用的是C#.Net。在这种情况下,您只需要这样做:
(?xm)
(?>
<(?<Tagname>div)[^>]*?class="txt-block"[^>]*>
)
(?(Tagname)
(
</(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)
|
(?>
<(?<Tagname>[a-z][^\s>]*)[^>]*>
)
|
[^<]+
)+?
(?(Tagname)(?!))
)
Run Code Online (Sandbox Code Playgroud)
或者,单行版本:
(?m)(?><(?<Tagname>div)[^>]*?class="txt-block"[^>]*>)(?(Tagname)(</(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)|(?><(?<Tagname>[a-z][^\s>]*)[^>]*>)|[^<]+)+?(?(Tagname)(?!)))
Run Code Online (Sandbox Code Playgroud)
选择你的毒药。正则表达式比人们想象的更强大,更可靠。我发布的最复杂的示例不适用于Regex Buddy,但适用于任何.Net框架。Regex Buddy不支持Balancing Groups,这是一种.Net风格。