PHP разработки
Поиск/замена по шаблону в котором есть
Сравнение с шаблоном (LIKE REGEXP) не работает в SQL если в строке есть символ '\' (обратный слэш), даже если он экранирован. Почему?
Например, почему не работает такой запрос: SELECT * FROM tableName WHERE charFieldName LIKE "%\\%" - выбрать из таблицы tableName ряды в которых поле charFieldName содержит обратный слэш (\). При этом сам обратный слэш в запросе экранирован.
Ответ: Потому что запрос неправильно записан.
Правильный запрос выглядит так:
SELECT * FROM tableName WHERE charFieldName LIKE "%\\\\%"
Чтобы выполнить поиск символа '\', его следует указать как '\\\\'.
При чиной такой записи является то, что обратные слеши удаляются дважды: сначала синтаксическим анализатором, а потом - при выполнении сравнения с шаблоном, таким образом остается только один обратный слеш, который и будет обрабатываться.
Экранирование слэша в PHP
Допустим, у нас есть переменная:$var='abcd\f\\gh';Задача: Убрать из строки обратные слэши.
Вроде бы можно это сделать так:
$var = preg_replace('/\\/','',$var);Но это работать не будет. Опять же из-за удаления синтаксическим анализатором. Чтобы это работало корректно, необходимо использовать конструкцию
$var = preg_replace('/\\\/','',$var);либо
$var = preg_replace('/\\\\/','',$var);К сожалению, удалить двойной обратный слэш (\\) так не получится. Потому что сколько не ставь обратных слэшей в шаблоне preg_replace('/\\\\/','',$var), удалится только второй слэш (в результате получится 'abcd\f\gh'), ну или возникнет Warning.