改造FAQ/検索処理でエラーになる
https://sos2wiki.chimata.org/?%E6%94%B9%E9%80%A0FAQ/%E6%A4%9C%E7%B4%A2%E5%87%A6%E7%90%86%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B原因 †
一つの可能性として正規表現のパターンが不適切である可能性があります。 例えば、文字コードが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件を表示しています。 コメントページを参照
Last-modified: 2019-04-30 (火) 00:57:44 (718d)