[PHP]preg_match()の正規表現を簡単に

Read More

PHPです。


■最初に
正規表現に使うパターン文字列には、いくつかの文字に対してエスケープ処理をかまさなくてはならないんだけど、
どの文字をエスケープしなくちゃいけないのか脳ミソが覚えてくれません。

なので最近はもっぱらpreg_quote()を使ってます。
注意すべきは第二引数の存在くらい。


--
■正規表現を使って挟まれた文字を取得する
こっちが重要

例えば、
あい{{tag}}うえ{{/tag}}お
かき{{tag}}くけ{{/tag}}こ

ってな文字列があったとします。


で、最初に出てくる{{tag}}から{{/tag}}を取得したいと考えました。
この時、{{tag}}と{{/tag}}の間の文字列は何が何文字入るかわかっていないものとします。


×間違ったパターン指定
<?php
$sPattern = '/('.preg_quote('{{tag}}').')(.*)('.preg_quote('{{/tag}}', '/').')/us';
preg_match($sPattern, $sTarget, $aryMatch);
?>



結果、$aryMatch['0']には
{{tag}}うえ{{/tag}}お
かき{{tag}}くけ{{/tag}}

が入ります。
これじゃダメ。


正しくはこう。


○正しいパターン指定
<?php
$sPattern = '/('.preg_quote('{{tag}}').')(.*?)('.preg_quote('{{/tag}}', '/').')/us';
preg_match($sPattern, $sTarget, $aryMatch);
?>

という具合に'?'を指定してやると、
期待する動作をしてくれます。


結果、$aryMatch['0']は
{{tag}}うえ{{/tag}}

となる。



違いはそれぞれ$aryMatchを出力してみて。