【问题标题】:Ruby Regex to capture everything between two strings (inclusive)Ruby Regex 捕获两个字符串之间的所有内容(包括)
【发布时间】:2012-11-06 22:01:49
【问题描述】:

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

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

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

我已经尝试过 /&lt;div class="the_class"&gt;(.*)&lt;\/div&gt;/m 并且可行,但它也会匹配并包含文档中的任何其他 &lt;/div&gt; 标记,这是我不想要的。

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

【问题讨论】:

  • 为什么要避免使用像 Nokogiri 这样的解析器,因为它可以让你想做的事情变得更容易?
  • @theTinMan 因为它增加了另一个依赖项并减慢了我的工作速度。让事情变得更复杂。此外,此解决方案不仅适用于 HTML 标签。我的开始和结束字符串可以是任何东西。

标签: ruby regex string html-sanitizing


【解决方案1】:

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

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

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

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

正则表达式 /&lt;div class="the_class"&gt;(.*?)&lt;\/div&gt;/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 提要,但一些预处理解决了这个问题。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2014-04-27
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      相关资源
      最近更新 更多