谁能告诉我如何使用 Ruby 中的正则表达式将标记的开头与<div>
标记的结尾相匹配?</div>
例如,假设我有一个:
<div>
<p>test content</p>
</div>
到目前为止,我有这个:
< div [^>]* > [^<]*<\/div>
但它似乎不起作用。
Nokogiri 很棒,但是恕我直言,有些情况下它不能使用。
对于您的情况,您可以使用它:
puts str.scan(/<div>(.*)<\/div>/im).flatten.first
<p>test content</p>
要匹配<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"
这就是我们推荐解析器的原因。
正如 PinnyM 所指出的那样,像Nokogiri这样的 HTML 解析器可能比使用 a 更好。Regex
这是 Nokogiri 页面上的教程,描述了如何搜索 HTML/XML 文档。
这个stackoverflow 问题演示了类似于您想要使用 CSS 选择器完成的任务。也许这样的东西对你有用。