为什么我的Ruby预测正则表达式不起作用

时间:2012-11-17 17:10:47

标签: ruby regex regex-lookarounds

  

可能重复:
  RegEx match open tags except XHTML self-contained tags

我在rubular.com中测试了我的正则表达式并且它可以工作,但是当我运行代码时,它的行为却不同。

我想从一些HTML代码中解析整个段落

这是我的正则表达式

description = ad_page.body.scan(/(?<=<span id="preview-local-desc">).+(?=<\/span>)/m)

以下是一些HTML源代码

<span id="preview-local-desc"> I want to pick up everything typed here.
Paragraphs, everything.
</span>

匹配从我需要的地方开始,然后它一直保持匹配到文档的末尾。

2 个答案:

答案 0 :(得分:4)

除了you shouldn't parse HTML with regex之外,你还需要非贪婪的匹配:

/(?<=<span id="preview-local-desc">).+?(?=<\/span>)/m

答案 1 :(得分:0)

如果您拥有或控制文件的格式,使用正则表达式解析XML或HTML对于简单的任务来说是可以接受的。如果不这样做,那么对文件的简单更改可能会破坏正则表达式。

使用解析器可以避免这个问题;我用Nokogiri解析了一些可怕的XML,它甚至没有注意到。在编写了一个处理1000多个feed的RSS聚合器后,我迷上了使用解析器。

require 'nokogiri'

html = '<span id="preview-local-desc"> I want to pick up everything typed here.
Paragraphs, everything.
</span>'

doc = Nokogiri.HTML(html)
doc.at('span').text
# => " I want to pick up everything typed here.\n    Paragraphs, everything.\n    "

如果您想要多个<span>代码:

doc.search('span').map(&:text)
# => [" I want to pick up everything typed here.\n    Paragraphs, everything.\n    "]

如果有多个<span>代码,而您只需要这个代码:

doc.at('span#preview-local-desc').text
# => " I want to pick up everything typed here.\n    Paragraphs, everything.\n    "