以下のような文字列があるとして、idがtestであるタグの外部(abc~lmn)を取得する正規表現が知りたいです。
※divタグの中にはほかの属性(style,alt等)が入る可能性があります
< div id="test" style="">abc
defg
hijk
<span>abc</span>
<span>abc</span>
lmn
</div>
http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/regex-4-27.html
ここを参考にしていますが、自分も試してますがうまくいかず。
なにぶん急ぎなものでして…ぜひお力を貸していただきたく思います。
よろしくお願いします。
http://www.rider-n.sakura.ne.jp/regexp/regexp.php
こういうことですか?趣旨を間違えてたらポイントなしで
<.+ id="test".+?>(abc.+lmn)\n<.+>
Rubyで。
html = <<EOS < div id="test" style="">abc defg hijk <span>abc</span> <span>abc</span> lmn </div> EOS puts html[ /< div[^>]*id="test"[^>]*>(.+)<\/div>/m, 1 ] # >> abc # >> defg # >> hijk # >> <span>abc</span> # >> <span>abc</span> # >> lmn
ご回答ありがとうございます。
教えていただいた正規表現を試したところ、希望通り取得できました。
さすがです!ありがとうございまs…
と書いたところで提示したサンプルが間違っていたことに気づきましたorz
すいません。肝心なところを間違えていました。
サンプルでは<span>を使っていますが、実際困っていたのは<div>タグの入れ子問題でした。
<div id="test">~<div>aaa</div></div>
とすると、(.+?)とかの最短マッチが使えません…この時点で私の知識ではメモリオーバーです。
引き続き回答お待ちしております…
回答者1ですが、こういうことですか?
上位のタグがDIVと決まってる場合
< div id="test" style="">(.+)\n</div>
上位のタグが不定な場合
<.+id="test".*?>(.+)\n<.+>
ご回答ありがとうございました。
最長マッチだからspanをdivにしてもうまくいきますよ?
ただし、
html = <<EOS < div id="test" style="">abc defg hijk <div>abc</div> <div>abc</div> lmn </div> EOS puts html[ /< div[^>]*id="test"[^>]*>(.+)<\/div>/m, 1 ] # >> abc # >> defg # >> hijk # >> <div>abc</div> # >> <div>abc</div> # >> lmn
ご回答ありがとうございました。
↓の条件の正規表現はよくわからない…
複雑なHTMLを解析するならば専門のライブラリを使ったほうが現実的だろう。 Rubyならばhpricotを。 hpricotのインストールは「sudo gem install hpricot」にて。
html = <<EOS <div id="test" style="">abc defg hijk <div>abc</div> <div>abc</div> lmn </div> <div> hoge </div> EOS require 'rubygems' require 'hpricot' puts((Hpricot(html) / "div#test").inner_html.to_s) # >> abc # >> defg # >> hijk # >> <div>abc</div> # >> <div>abc</div> # >> lmn
ご回答ありがとうございました。
PHPなんですがライブラリを探してみます!
ご回答ありがとうございます。
abcとかlmnとかは適当な文字で、
・任意の文字が入る
・改行が入る
・入れ子のタグが入る
ということを示したかっただけです。
引き続き回答お待ちしております。