【问题标题】:Extract string from HTML tags using RegExp (Ruby)使用 RegExp (Ruby) 从 HTML 标签中提取字符串
【发布时间】:2013-08-09 05:32:21
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 基于什么?你只想要任何 div 中的所有文本吗?这可能最好使用某种 dom 解析器而不是正则表达式。
  • @smerny 抱歉,我解决了这个问题。我的老板要求我使用正则表达式,所以我别无选择:/
  • Nokogiri 是解析 HTML 和 XML 内容的最佳工具..
  • 我们需要更多信息。字符串的哪一部分是可变的?例如,一个简单的解决方案可能是regex = /<h1>test<\/h1><div>([^<]*)<\/div>/
  • 嗯,这只是整个字符串的一小部分,所以不幸的是没有简单的解决方案起作用(我试过了,但正则表达式太笨重了)。所有标签都将始终保持不变,只是里面的内容(即“toast”)会改变

标签: ruby regex html-parsing


【解决方案1】:

您可以使用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"

【讨论】:

  • 抱歉,我解决了这个问题。这应该没那么复杂吧?
  • 使用 HTML 解析器并不复杂。处理您不期望但仍然是完全有效的 HTML 的数据更改是很复杂的。预先花一点时间使用适当的 HTML 解析器,可以节省您数小时的调试时间,也可以省去以后的烦恼。
【解决方案2】:

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

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

【讨论】:

  • 这隔离了正确的信息(toast),但我有一个问题 - 如果我想返回它,我必须在字符串上使用什么?我试过 string.split(/(?).*(?=)/) 和 string.scan(/(?).*(?=)/) 但都不正确。
【解决方案3】:

我们需要更多信息。如果字符串正好是"&lt;h1&gt;test&lt;/h1&gt;&lt;div&gt;toast&lt;/div&gt;",那么就很天真了

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。和你的老板谈谈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多