正規表現で文字列検索を行いたいときに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サイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。