当我这样做时
puts /<title>(.*?)<\/title>/.match(html)
我得到了
<h2>foobar</h2>
但我想要
foobar
这样做最优雅的方法是什么?
答案 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解析器,你真的应该这样做。