原因

一つの可能性として正規表現のパターンが不適切である可能性があります。 例えば、文字コードが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関数を使用

コメント

最新の20件を表示しています。 コメントページを参照

お名前:

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-04-30 (火) 00:57:44 (718d)