试图在c#</div>中使用正则表达式获得整个<div>

时间:2013-05-08 12:35:30

标签: c# html regex

我正试图在c#中刮掉整个div元素。

我已经尝试了div class="txt-block"\s*(.+?)(\r\n?|\n)\s*"但它并没有把它全部刮掉:( 有任何想法吗? 这是div .. THX!

    <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>&nbsp;&raquo;
</div> 

2 个答案:

答案 0 :(得分:5)

为什么这么多的选票呢?因为你不会用正则表达式解析HTML,他是不允许的?那是非常狭隘的。

我已经看到很多时候htmlagilitypack无法正确解析可怕的格式错误的html文档,或者无法从大量捕获中解析连接或嵌套的HTML文档。或者任何形式的XPath都不起作用,因为HTML文档是动态创建的,不一致,并且不一定包含标识属性。当一个非常简单的正则表达式更加可靠时,为什么要导入额外的包含并解决草率标记?

如果您有一个大型项目,项目中的单个方法只需要提取输入HTML文档的DIV内容,该怎么办?它不是一个完整的HTML解析项目,只需要一个正则表达式。您的答案是包含更多导入并为此构建一个全新的框架?我每年做数百个项目。一半使用DOM / XPath,另一半根本不能,并且需要Regex。

总之,不要那么狭隘。参考XPath / DOM工具,但有助于回答问题。不要只是投票。我们不是尼安德特人,他们需要一直嘲笑古老的“不要用正则表达式解析HTML”的帖子。

答案如下:

首先,单纯的一个:

(?s)<div.*?>(.*?)</div>

需要一个特别命名的div?

(?s)<div[^>]*?class="txt-block"[^>]*?>(.*?)</div>

想要节省CPU并避免不必要的回溯?

<div[^>]*?class="txt-block"[^>]*?>(([^<]*(?(?!</div>)<))*)</div>

以上假设您没有嵌套的DIV项目。那就是不使用正则表达式的整个想法真正发挥作用。除非您使用的是C#.Net。在这种情况下,你只需要这样做:

(?xm)
    (?>
        <(?<Tagname>div)[^>]*?class="txt-block"[^>]*>
)
(?(Tagname)
    (
        </(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)
    |
        (?>
            <(?<Tagname>[a-z][^\s>]*)[^>]*>
        )
    |
        [^<]+
    )+?
    (?(Tagname)(?!))
)

或者,单行版本:

(?m)(?><(?<Tagname>div)[^>]*?class="txt-block"[^>]*>)(?(Tagname)(</(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)|(?><(?<Tagname>[a-z][^\s>]*)[^>]*>)|[^<]+)+?(?(Tagname)(?!)))

选择你的毒药。正则表达式比人们想象的更强大,更可靠。我发布的最复杂的例子在Regex Buddy中不起作用,但可以在任何.Net框架中使用。 Regex Buddy不支持Balancing Groups,这是一种.Net风格。

答案 1 :(得分:0)

使用正则表达式解析HTML并不是一个好主意。尝试在c#中找到用于解析HTML的库。

在我quick search之后我想出了这个库:http://htmlagilitypack.codeplex.com/看来这个库具有你需要的所有功能。