谁能告诉我怎么可以<div>
标签开始匹配</div>
标签的一端与Ruby的正则表达式?匹配<div></div>标签用正则表达式的红宝石
比如让说我有一个:
<div>
<p>test content</p>
</div>
到目前为止,我有这样的:
< div [^>]* > [^<]*<\/div>
,但它似乎并不工作。
谁能告诉我怎么可以<div>
标签开始匹配</div>
标签的一端与Ruby的正则表达式?匹配<div></div>标签用正则表达式的红宝石
比如让说我有一个:
<div>
<p>test content</p>
</div>
到目前为止,我有这样的:
< div [^>]* > [^<]*<\/div>
,但它似乎并不工作。
像PinnyM指出的那样,HTML解析器(如Nokogiri)可能会比使用Regex
更好。
Here是一个介绍如何搜索HTML/XML文档的Nokogiri页面的教程。
这个stackoverflow question演示了类似于你想用CSS选择器完成的事情。也许这样的事情会对你有用。
要匹配<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"
这就是为什么我们推荐解析器。
Nokogiri是伟大的,但是,恕我直言,有不能使用的情况。
为了您的单纯情况下,你可以使用这个:
puts str.scan(/<div>(.*)<\/div>/im).flatten.first
<p>test content</p>
太脆了。如果他的实际页面与他给出的简化示例略有不同,那么可以打破许多方式。 –
此外,我做了很多刮擦,我从来没有遇到过不能使用Nokogiri的情况。 –
+1 @MarkThomas,我多年来一直使用Nokogiri,从来没有发现它不足的情况。我已经编写了大蜘蛛和RSS聚合器,并处理了破坏的XML,导致其他XML解析器崩溃。 –
[?你确定你想这样做(http://stackoverflow.com/questions/1732348/regex-match-open-tags -except-xhtml-self-contained-tags/1732454#1732454)一个html/xml解析器可能是一个更好的工具... – PinnyM
我正准备发布它! – Zajn
是的,我相信,我只是学习如何使用正则表达式上的红宝石,我可能甚至不使用它在现实生活中的工作.. – user486174