トップ 新規 編集 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

検索処理でエラーになる

[改造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関数を使用

お名前: コメント: