検索ロジックにおけるバックスラッシュとワイルドカードのエスケープ処理
検索ロジックの改修で、*
をワイルドカードとして扱う改修を行っています。
(SQLで言う%と同じ扱いです。)
*
のエスケープは、\*
としています。
結果として、検索文字列に対して、以下の変換処理を行い、その文字列でSQLの発行を行うようにしました。
$search_val = preg_replace('/(?<!\\\)\*/', '%', $search_val_base);
上記コードにて、
* => %
と変換
\* => \*
と変換しないようにして、エスケープに対応しました。
しかし、このコードですと、バックスラッシュが複数あるケースには対応できませんでした。
例:
理想: \\* =>\\%
、実際: \\* =>\\*
理想: \\\* =>\\\*
、実際: \\\* =>\\\*
理想: \\\\* =>\\\\%
、実際: \\\\* =>\\\\*
上記のように、バックスラッシュが偶数個の時は変換が必要、奇数個の時は変換が不要となっているので、偶数/奇数での判定を考えたのですが、正規表現での偶数個/奇数個の判別はできそうにありませんでした。
また、プログラム(PHP)上での文字列操作も考えたのですが、PHPではバックスラッシュを2つ重ねると、エスケープ処理と判定されるようで、バックスラッシュ1つとの判別ができないと考えています。
例:
$val = "aaa*aaa\*aaa\\*aaa\\\*aaa";
をvar_dump()で出力すると、
string(23) "aaa*aaa\*aaa\*aaa\\*aaa"
と出力されます。
以上を踏まえて、下記の疑問に回答いただけないでしょうか
質問1.正規表現で偶数個/奇数個の判別は可能か?
質問2.PHPでの\
と\\
の判別
質問3.何か他にアイディアがあれば…