0

可能重复:
正则表达式匹配打开的标签,XHTML 自包含标签除外

我在 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>

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

4

2 回答 2

4

除了您不应该使用 regex 解析 HTML之外,您还需要非贪婪匹配:

/(?<=<span id="preview-local-desc">).+?(?=<\/span>)/m
于 2012-11-17T17:15:24.490 回答
0

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

使用解析器可以避免这个问题;我用Nokogiri解析了一些可怕的 XML,它甚至没有注意到。在编写了一个处理 1000 多个提要的 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    "
于 2012-11-17T23:30:51.337 回答