Ruby Regex:只返回匹配

时间:2011-07-19 19:49:22

标签: ruby regex

当我这样做时

puts /<title>(.*?)<\/title>/.match(html)

我得到了

<h2>foobar</h2>

但我想要

foobar

这样做最优雅的方法是什么?

2 个答案:

答案 0 :(得分:4)

最优雅的方法是使用HTML parser解析HTML:

require 'nokogiri'

html  = '<title><h2>Pancakes</h2></title>'
doc   = Nokogiri::HTML(html)
title = doc.at('title').text
# title is now 'Pancakes'

如果您尝试使用正则表达式执行此操作,则可能会失败。例如,如果您的<h2>中有<title>,那么阻止您有类似这样的内容:

<title><strong>Where</strong> is <span>pancakes</span> <em>house?</em></title>

尝试使用单个正则表达式来处理类似的事情会很难看,但doc.at('title').text处理<title>Pancakes</title><title><h2>Pancakes</h2></title>时很容易处理。

正则表达式是很棒的工具,但它们不应该是工具箱中的唯一工具。

答案 1 :(得分:2)

此样式的某些内容只会返回匹配内容。

html[/<title>(.*?)<\/title>/,1]

也许您需要告诉我们更多内容,例如html可能包含的内容,但是现在,您正在捕获标题栏的内容,而不管内部标记。我认为这是你应该这样做的方式,而不是假设你想要处理一个内部标签,特别是因为如果你有两个内部标签会发生什么?这就是为什么每个人都告诉你使用html解析器,你真的应该这样做。