正規表現について質問です。


以下のような文字列があるとして、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
ここを参考にしていますが、自分も試してますがうまくいかず。
なにぶん急ぎなものでして…ぜひお力を貸していただきたく思います。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2008/07/24 00:12:24
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:n_kusano No.1

回答回数48ベストアンサー獲得回数1

ポイント20pt

http://www.rider-n.sakura.ne.jp/regexp/regexp.php


こういうことですか?趣旨を間違えてたらポイントなしで

<.+ id="test".+?>(abc.+lmn)\n<.+>

id:jun09

ご回答ありがとうございます。

abcとかlmnとかは適当な文字で、

・任意の文字が入る

・改行が入る

・入れ子のタグが入る

ということを示したかっただけです。

引き続き回答お待ちしております。

2008/07/22 23:10:13
id:rubikitch No.2

回答回数120ベストアンサー獲得回数22

ポイント20pt

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
id:jun09

ご回答ありがとうございます。

教えていただいた正規表現を試したところ、希望通り取得できました。

さすがです!ありがとうございまs…

と書いたところで提示したサンプルが間違っていたことに気づきましたorz

すいません。肝心なところを間違えていました。

サンプルでは<span>を使っていますが、実際困っていたのは<div>タグの入れ子問題でした。

<div id="test">~<div>aaa</div></div>

とすると、(.+?)とかの最短マッチが使えません…この時点で私の知識ではメモリオーバーです。

引き続き回答お待ちしております…

2008/07/22 23:38:06
id:n_kusano No.3

回答回数48ベストアンサー獲得回数1

ポイント20pt

回答者1ですが、こういうことですか?

上位のタグがDIVと決まってる場合

< div id="test" style="">(.+)\n</div>


上位のタグが不定な場合

<.+id="test".*?>(.+)\n<.+>

id:jun09

ご回答ありがとうございました。

2008/07/24 00:11:36
id:rubikitch No.4

回答回数120ベストアンサー獲得回数22

ポイント20pt

最長マッチだからspanをdivにしてもうまくいきますよ?

ただし、

の後に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
id:jun09

ご回答ありがとうございました。

2008/07/24 00:11:33
id:rubikitch No.5

回答回数120ベストアンサー獲得回数22

ポイント20pt

↓の条件の正規表現はよくわからない…

複雑な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
id:jun09

ご回答ありがとうございました。

PHPなんですがライブラリを探してみます!

2008/07/24 00:11:30

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません