2011-07-19 7 views
0

私はRubyの正規表現:リターンちょうど試合

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

は私が

<h2>foobar</h2> 

を得るのです。しかし、私はちょうどそうするための最もエレガントな方法は何ですか

foobar 

したいですか?

+3

これはおそらく、[正規表現でHTMLを解析しないでください](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained- tags/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が含まれているかもしれないが、今、あなたは関係なく、内部タグの、タイトルブロックの内容をキャプチャしているかのように、より多くの私たちに指示する必要があります。私はあなたがそれをやるべきであると思います。内部タグを2つ持っていたら何が起こるのでしょうか?これは誰もが本当にすべきhtmlパーサを使用するように指示している理由です。