2012-11-15 33 views
0

谁能告诉我怎么可以<div>标签开始匹配</div>标签的一端与Ruby的正则表达式?匹配<div></div>标签用正则表达式的红宝石

比如让说我有一个:

<div> 
<p>test content</p> 
</div> 

到目前为止,我有这样的:

< div [^>]* > [^<]*<\/div> 

,但它似乎并不工作。

+5

[?你确定你想这样做(http://stackoverflow.com/questions/1732348/regex-match-open-tags -except-xhtml-self-contained-tags/1732454#1732454)一个html/xml解析器可能是一个更好的工具... – PinnyM

+0

我正准备发布它! – Zajn

+1

是的,我相信,我只是学习如何使用正则表达式上的红宝石,我可能甚至不使用它在现实生活中的工作.. – user486174

回答

0

像PinnyM指出的那样,HTML解析器(如Nokogiri)可能会比使用Regex更好。

Here是一个介绍如何搜索HTML/XML文档的Nokogiri页面的教程。

这个stackoverflow question演示了类似于你想用CSS选择器完成的事情。也许这样的事情会对你有用。

1

要匹配<div>当这一切都在同一行,使用:

/<div[^>]*>/ 

但是,将任何标记突破与标签内的新线。如果在<div之间有空白,那么它也会中断。

最后,在添加了所有可能的标记写法的额外检查之后,您需要考虑一种更好的方法,那就是使用解析器,比如Nokogiri,它可以处理HTML和XML更容易。

例如,因为你试图撕开HTML:

<div> 
<p>test content</p> 
</div> 

它很容易被猜到你真的想“测试内容”。如果将HTML改为:

<div><p>test content</p></div> 

或者更糟:

<div 
><p> 
test 
content 
</div> 

浏览器不会在意,也不会对一个很好的解析器,但正则表达式将生气,并要求返工。

require 'nokogiri' 
require 'pp' 

doc = Nokogiri.HTML(<<EOT) 
    <div 
    ><p> 
    test 
    content 
    </div> 
EOT 
pp doc.at('p').text.strip.gsub(/\s+/, ' ') 
# => "test content" 

这就是为什么我们推荐解析器。

1

Nokogiri是伟大的,但是,恕我直言,有不能使用的情况。

为了您的单纯情况下,你可以使用这个:

puts str.scan(/<div>(.*)<\/div>/im).flatten.first 

<p>test content</p> 
+0

太脆了。如果他的实际页面与他给出的简化示例略有不同,那么可以打破许多方式。 –

+1

此外,我做了很多刮擦,我从来没有遇到过不能使用Nokogiri的情况。 –

+0

+1 @MarkThomas,我多年来一直使用Nokogiri,从来没有发现它不足的情况。我已经编写了大蜘蛛和RSS聚合器,并处理了破坏的XML,导致其他XML解析器崩溃。 –