【问题标题】:Problem with Ruby Regular ExpressionRuby正则表达式的问题
【发布时间】:2011-01-17 19:02:07
【问题描述】:

我有这个 HTML 代码,它在一行中:

<h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3><h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3>

这是行友好的版本(我不能使用)

<h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3>
<h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3>

我正在尝试使用此 REGEX 仅提取 URL

/<h3 class="r"><a href="(.*)">(.*)<\/a>/

然后它返回

www.google.com">fkdsafjldsajl</a></h3><h3 class='r'><a href="www.google.com"

找到 " 时我该怎么做才能阻止它?

【问题讨论】:

  • 使用正则表达式解析 HTML 时要非常小心。即使在简单的 HTML 中,您也可能会遇到一个弄乱正则表达式的 URL。

标签: ruby regex web-crawler


【解决方案1】:

叹息。正则表达式和 HTML 是如此尴尬的伙伴:

require 'nokogiri'

html = %q{<h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3><h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3>}
doc = Nokogiri::HTML(html)
puts doc.css('a').map{ |a| a['href'] }
# >> www.google.com
# >> www.google.com

这将找到它们,无论它们是深度嵌套还是全部在一行中。

【讨论】:

    【解决方案2】:

    问题是* 是贪婪的。在它后面加上一个问号使其不贪婪。

    工作正则表达式(在rubular 上测试)

    href\=\"(.*?)\"
    

    【讨论】:

    • 即使(.*?)" 可以吃"。最好使用[^"]+"
    • 我不知道 OP 用例是否会遇到用单引号括起来的 href,但是,由于它们在 HTML 中是合法的,因此建议的模式应该可以处理这些问题。而且,由于很多 HTML 缺少包装双引号和单引号,它可能也应该处理它。此外,根据 URL spec 的第 2.2 节倒数第二段,'" 在 URL 中是合法的,因此它可能也应该处理这些。
    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多