2011-07-19 76 views
0

當我做紅寶石正則表達式:回到剛纔的比賽

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

我得到

<h2>foobar</h2> 

但我只想

foobar 

什麼是這樣做的最優雅的方法是什麼?

+3

它可能是apropos通知你[你不應該用正則表達式解析HTML](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-標籤/ 1732454#1732454),因爲HTML不是常規語言。 –

+0

@Kerrek:正則表達式很長一段時間還沒有正規化。使用正則表達式解析HTML仍然不是一個好主意。 –

回答

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' 

如果你嘗試用正則表達式來做到這一點,你可能會失敗。例如,如果你在你的<title><h2>什麼是防止你有這樣的事情:

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

試圖處理類似的東西用一個正則表達式將是醜陋的,但doc.at('title').text處理是一樣容易它處理<title>Pancakes</title><title><h2>Pancakes</h2></title>

正則表達式是很棒的工具,但它們不應該是工具箱中唯一的工具。

2

這種風格的東西只會返回匹配的內容。

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

也許你需要更多地告訴我們,像什麼HTML可能含有,但現在,你捕捉不論內部變量標題欄的內容。我認爲這是你應該這樣做的方式,而不是假設你想要處理一個內部標籤,特別是因爲如果你有兩個內部標籤會發生什麼?這就是爲什麼每個人都在告訴你使用一個html解析器,你應該這樣做。