preg_matchで複数行の検索を行う

まっちー

まっちー

正規表現で文字列検索を行いたいときにpreg_matchを使うことがある。

$str = 'アストロデオのブログ';
preg_match('/ブログ/', $str, $result);

//$resultの中身
array([0] => ブログ)

このpreg_match、検索対象の文字列が1行なら特に問題ないのだけど、複数行にまたがるようなときは、上記の書き方だと上手く結果を返してくれない。

file_get_contentsなどでファイルの情報を取得し、さらにその中の一部の情報を取得したいようなとき、1行だけしか検索できないと、都合が悪いことがある。

<div>
 € € € <p>アストロデオのブログ</p>
</div>

例えばsample.htmlに上のようなコードがあり、そこを丸々取得したいとする。

$data = file_get_contents('sample.html');
preg_match('/<div>(.*)</div>/', $data, $result);

//$resultの中身
array([0] => )

上記の書き方だと、こんな結果が返ってきてしまう。

そういうときは、デリミタの後ろにsをつけると良い。

preg_match('/<div>(.*)</div>/s', $data, $result);

//$resultの中身
array([0] =>
 € € € <div>
 € € € € € € € <p>アストロデオのブログです</p>
 € € € </div>
)

このsは、改行を無視して1行とみなして検索しますよという意味を持つらしい。つまり<div>~</div>を1行とみなしてくれるから、ちゃんと検索結果が返ってくる。

LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

プログラマのまっちーです。酒が大好きです。ある一定量のお酒を飲むと壊れたレディオモードに入り、同じことを繰り返す癖があります。宜しくお願いいたします。

このメンバーの記事をもっと読む