• ベストアンサー

正規表現で複数行に渡る範囲を取り出す

<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>/ と書いてみたんですが、改行などがありうまくいきませんでした。 どのようにに記述すればうまくいくんでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

> preg_match(/<div class=\"content\">.*<\/div>/s),$target); > と書いて、divの中身を取り出すことはできたのですが、 > <div class="content">の対の</div>ではなく、html文中にある一番最後の</div>が対象になってしまいました。 * だと最長一致なので 代わりに最短一致の *? を使ってみてはどうでしょう。 (/<div class=\"content\">.*?<\/div>/s

elisleaf
質問者

お礼

ありがとうございました。 うまくいきました!!

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

preg_* なら sオプションを追加してください。 mb_ereg*なら、パターンに埋め込み、かなあ。 "(?s)...."

elisleaf
質問者

お礼

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個目を指定などは可能でしょうか?

elisleaf
質問者

補足

preg_matchを使っているんですが、sオプションは何を意味するんでしょうか? マニュアルを見てもそれらしいものが見つからなかったんですが。

  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

最初に全行を取込んでから処理してみては? 取込む際に無駄な改行コードを削除してから 正規表現でデータを取り出してみてはいかがでしょうか?

elisleaf
質問者

お礼

ありがとうございます。 \sで「空白文字(スペース、復帰文字、タブ、改行文字、ラインフィード)」みたいだったので下のように書いたのですが、 preg_replace("/\s/", '', $target); <div class="content">が<divclass="content">のように、タグの中のスペースまで削除されてしまいました。