人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

よろしくお願いします。

●質問者: jun09
●カテゴリ:コンピュータ インターネット
✍キーワード:ABC test タグ 属性 文字列
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● n_kusano
●20ポイント

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


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

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

◎質問者からの返答

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

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

・任意の文字が入る

・改行が入る

・入れ子のタグが入る

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

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


2 ● るびきち
●20ポイント

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>

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

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


3 ● n_kusano
●20ポイント

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

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

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


上位のタグが不定な場合

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

◎質問者からの返答

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


4 ● るびきち
●20ポイント

最長マッチだから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
◎質問者からの返答

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


5 ● るびきち
●20ポイント

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

複雑な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なんですがライブラリを探してみます!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ