検索ロジックの改修で、*をワイルドカードとして扱う改修を行っています。
(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.何か他にアイディアがあれば…