- ベストアンサー
正規表現で複数行に渡る範囲を取り出す
<html> <div></div> <div class="content"> <b>内容<b/><br /> <img src="#" /> <p>ほげほげほげほげ</p> </div> <div></div> </html> 上のようなHTMLがあるとします。<div>の前後にもhtmlは書かれています。 そこから正規表現で<div class="content">~~~</div>の中身を取り出したいのですが、できません。 言語はPHPで、 /<div class=\"content\">.*<\/div>/ と書いてみたんですが、改行などがありうまくいきませんでした。 どのようにに記述すればうまくいくんでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> preg_match(/<div class=\"content\">.*<\/div>/s),$target); > と書いて、divの中身を取り出すことはできたのですが、 > <div class="content">の対の</div>ではなく、html文中にある一番最後の</div>が対象になってしまいました。 * だと最長一致なので 代わりに最短一致の *? を使ってみてはどうでしょう。 (/<div class=\"content\">.*?<\/div>/s
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
preg_* なら sオプションを追加してください。 mb_ereg*なら、パターンに埋め込み、かなあ。 "(?s)...."
お礼
http://php.holywar.net/manual/ja/reference.pcre.pattern.modifiers.php すいません。書いてありました。 preg_match(/<div class=\"content\">.*<\/div>/s),$target); と書いて、divの中身を取り出すことはできたのですが、 <div class="content">の対の</div>ではなく、html文中にある一番最後の</div>が対象になってしまいました。 1個目を指定などは可能でしょうか?
補足
preg_matchを使っているんですが、sオプションは何を意味するんでしょうか? マニュアルを見てもそれらしいものが見つからなかったんですが。
- calltella
- ベストアンサー率49% (317/635)
最初に全行を取込んでから処理してみては? 取込む際に無駄な改行コードを削除してから 正規表現でデータを取り出してみてはいかがでしょうか?
お礼
ありがとうございます。 \sで「空白文字(スペース、復帰文字、タブ、改行文字、ラインフィード)」みたいだったので下のように書いたのですが、 preg_replace("/\s/", '', $target); <div class="content">が<divclass="content">のように、タグの中のスペースまで削除されてしまいました。
お礼
ありがとうございました。 うまくいきました!!