0

谁能告诉我如何使用 Ruby 中的正则表达式将标记的开头与<div>标记的结尾相匹配?</div>

例如,假设我有一个:

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

到目前为止,我有这个:

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

但它似乎不起作用。

4

3 回答 3

2

Nokogiri 很棒,但是恕我直言,有些情况下它不能使用。

对于您的情况,您可以使用它:

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

<p>test content</p>
于 2012-11-15T22:55:04.947 回答
1

要匹配<div>全部在一行上的时间,请使用:

/<div[^>]*>/

但是,这将在标签内带有换行符的任何标记上中断。<如果and之间有空格,它也会中断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"

这就是我们推荐解析器的原因。

于 2012-11-15T22:21:46.687 回答
0

正如 PinnyM 所指出的那样,像Nokogiri这样的 HTML 解析器可能比使用 a 更好。Regex

是 Nokogiri 页面上的教程,描述了如何搜索 HTML/XML 文档。

这个stackoverflow 问题演示了类似于您想要使用 CSS 选择器完成的任务。也许这样的东西对你有用。

于 2012-11-15T22:21:35.790 回答