preg_match() に変数を入れたら”/”でエラーが出てしまう場合の解決法 → Warning: preg_match() [function.preg-match]: Unknown modifier

Warning: preg_match() [function.preg-match]: Unknown modifier ‘W’ in /home/dacelo/html/DocumentRoot/preg.php on line 104

preg_matchで処理をしている部分で、上記のようなエラーが出てしまいまして。
ここには、他のプロセスから変数で持ってきた文字列をチェックしているんですが、これまではうまくいっていたのに、なんでだろう…?
問題の変数を調べてみるとこんな値でした。

「野球/WBC」

ああ、なるほど。普通に文字列としていれる場合は
‘/野球\/WBC/’と、スラッシュをエスケープするところですが、変数で渡しているのでこれが出来ない。
こういう場合、二つの解決方法があります。

1.変数に関数preg_quote()を通す

preg_quoteという関数をフィルターとして通すと、preg正規表現用にエスケープしてくれます。

使用例

$hoge = preg_quote($hoge);

これで、$hogeの中にスラッシュ等が入っていても大丈夫。

2.デリミタを{}にする

こっちのほうが手っ取り早いですね。
preg_match、preg_replaceのパターン表記は//を使うのが普通です。

<!--?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?-->

が、{}も使えるんですよね。

使用例

<!--?php
$subject = "abcdef";
$pattern = '{^def}';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?-->

なんだったら#も使える。URLとかを含む場合は、/をエスケープしなくて済むのでこっちのほうが便利。

$subject = "abcdef";
$pattern = '#^def#';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

以上、preg_match、preg_replaceで発生する、変数のエスケープに関する2つの解決方法でした。

広告

About: dacelo


Leave a Reply

Your email address will not be published. Required fields are marked *