2

我正在尝试清理一些 HTML 并删除一个标签(我真的很想避免使用 nokogiri 等)。因此,我想摆脱以下字符串:

<div class="the_class>Some junk here that's different every time</div>

这在我的字符串中只出现一次,我想找到一种方法来删除它。我试过想出一个正则表达式来捕获它,但我找不到一个有效的。

我已经尝试过/<div class="the_class">(.*)<\/div>/m并且有效,但它也会匹配并包含</div>文档中的任何其他标签,这是我不想要的。

关于如何解决这个问题的任何想法?

4

2 回答 2

7

我相信您正在寻找一个非贪婪的正则表达式,如下所示:

/<div class="the_class">(.*?)<\/div>/m

注意添加的?. 现在,捕获组将尽可能少地捕获(非贪婪),而不是尽可能多地捕获(贪婪)。

于 2012-11-19T00:17:16.960 回答
0

因为它增加了另一个依赖并减慢了我的工作。让事情变得更复杂。此外,此解决方案不仅适用于 HTML 标签。我的开始和结束字符串可以是任何东西。

在我找到一份编写蜘蛛和网站分析的工作之前,我以前也是这样想的,然后编写了一个大型的 RSS 聚合系统——解析器是摆脱这种疯狂的唯一方法。没有它,工作永远不会完成。

是的,正则表达式很好用,但是有龙等着你。例如,这个常见的字符串会导致问题:

'<div class="the_class"><div class="inner_div">foo</div></div>'

正则表达式/<div class="the_class">(.*?)<\/div>/m将返回:

"<div class=\"the_class\"><div class=\"inner_div\">foo</div>"

这是格式错误但可呈现的 HTML:

<div class="the_class"><div class="inner_div">foo

更糟糕的是:

'<div class="the_class"><div class="inner_div">foo'[/<div class="the_class">(.*?)<\/div>/m]
=> nil

然而,解析器可以同时处理这两种情况:

require 'nokogiri'
[
  '<div class="the_class"><div class="inner_div">foo</div></div>',
  '<div class="the_class"><div class="inner_div">foo'
].each do |html|
  doc = Nokogiri.HTML(html)
  puts doc.at('div.the_class').text
end

输出:

foo
foo

是的,你的开始和结束字符串可以是任何东西,但是有公认的解析 HTML/XML 的工具,随着你的任务的增长,使用正则表达式的弱点将变得更加明显。

而且,是的,解析器可能会失败。我不得不处理格式严重错误导致解析器崩溃的 RSS 提要,但是一些预处理解决了这个问题。

于 2012-11-20T16:42:02.367 回答