puts /<title>(.*?)<\/title>/.match(html)
我得到
<h2>foobar</h2>
但我只想
foobar
什麼是這樣做的最優雅的方法是什麼?
puts /<title>(.*?)<\/title>/.match(html)
我得到
<h2>foobar</h2>
但我只想
foobar
什麼是這樣做的最優雅的方法是什麼?
最優雅的方式是用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>
。
正則表達式是很棒的工具,但它們不應該是工具箱中唯一的工具。
這種風格的東西只會返回匹配的內容。
html[/<title>(.*?)<\/title>/,1]
也許你需要更多地告訴我們,像什麼HTML可能含有,但現在,你捕捉不論內部變量標題欄的內容。我認爲這是你應該這樣做的方式,而不是假設你想要處理一個內部標籤,特別是因爲如果你有兩個內部標籤會發生什麼?這就是爲什麼每個人都在告訴你使用一個html解析器,你應該這樣做。
它可能是apropos通知你[你不應該用正則表達式解析HTML](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-標籤/ 1732454#1732454),因爲HTML不是常規語言。 –
@Kerrek:正則表達式很長一段時間還沒有正規化。使用正則表達式解析HTML仍然不是一個好主意。 –