使用RegExp(Ruby)从HTML标记中提取字符串

时间:2013-08-07 17:45:06

标签: ruby regex html-parsing

我想从字符串<h1>test</h1><div>toast</div>中提取“toast”。什么正则表达式可以隔离这样的字符串?

编辑:感谢更正格式的用户。

更多信息:div标签总会只有一个实例,里面的信息可能会改变,但同一个字符串中永远不会有另一个div标签(字符串大于给定的样本)

谢谢!

3 个答案:

答案 0 :(得分:5)

您可以使用Nokogiri

require 'nokogiri'

doc = Nokogiri::HTML::Document.parse("<div> test </div> <div> toast </div>")
doc.css('div').map(&:text)
# => [" test ", " toast "]

require 'nokogiri'

doc = Nokogiri::HTML::Document.parse("<h1>test</h1><div>toast</div>")
doc.at_css('div').text
# => "toast"

答案 1 :(得分:1)

我们需要更多信息。如果字符串正好是"<h1>test</h1><div>toast</div>",那么就像

一样天真
regex = /<h1>test<\/h1><div>([^<]*)<\/div>/
found = "<h1>test</h1><div>toast</div>".match(regex)[1]
# => "toast"

会奏效。我最好的猜测就是你期待

<h1>*</h1><div>*</div>

然后使用它:

regex = /<h1>[^<]*<\/h1><div>([^<]*)<\/div>/
found = "<h1>any string can go here</h1><div>toast</div>".match(regex)[1]
# => "toast"

请注意,如果任一标记中存在任何嵌套元素,则会中断此操作。更强大的解决方案是使用Nokogiri。和老板谈谈。

答案 2 :(得分:1)

这通常不是通常用正则表达式完成的......并且有充分的理由,但是如果你必须并且因为你说过它将永远不会超过一个div ...这应该适合你:

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