検索処理でエラーになる
[改造FAQ]検索処理でエラーになる
原因
一つの可能性として正規表現のパターンが不適切である可能性があります。
例えば、文字コードがShift-JISでは以下のような場合にエラーとなります。
例1. 「表」を検索しようとして以下のようにした場合
$target = '対象'; $pattern = '表\'; # 「表」の末尾は「\」なので「\」を付加してエスケープしている if($target =~ /$pattern/){} # ここでエラー
例2. 「[」を検索しようとして以下のようにした場合
$target = '対象'; $pattern = '['; if($target =~ /$pattern/){} # ここでエラー
例1.は「表」の末尾が「\」であるため、パターンを閉じる右側の「/」がエスケープされてしまい閉じられないせいです。
例2.は「[」が正規表現のメタ文字であるため、無効な正規表現となっているせいです。
解決策
これを防ぐためにはパターンを「\Q」と「\E」で囲むか、quotemeta関数でエスケープ処理を施すようにします。
例a. 「\Q」と「\E」で囲む場合
$target = '対象'; $pattern = '表\'; if($target =~ /\Q$pattern\E/){} # メタ文字の無効化
例b. quotemeta関数でエスケープする場合
$target = '対象'; $pattern = '表\'; $pattern = quotemeta($pattern); # メタ文字のエスケープ if($target =~ /$pattern/){}
推奨
SOS2では正規表現が多用されていますが、この件のような問題と負荷的な面から、正規表現を用いたほうが記述量を大幅に少なくできる場合以外はindex関数で検索したほうが良いかと思います。
例A. index関数を使用する場合
$target = '対象'; $pattern = '表\'; if(index($target, $pattern) != -1){} # index関数を使用