Я ищу что-то похожее на preg_quote, но для синтаксиса regexp MySQL.
Любые идеи?
Я ищу что-то похожее на preg_quote, но для синтаксиса regexp MySQL.
Любые идеи?
MySQL regexps - это расширенный вариант POSIX (ERE), доступный в PHP как устаревшие функции ereg_
.
К сожалению, в PHP нет ereg_quote
, однако специальные символы PCRE являются надмножеством специальных символов ERE, а обратная косая черта с неспецифическим символом пунктуации не наносит ему вреда, поэтому вы можете избежать использования preg_quote
безопасно.
(Естественно, вам понадобится параметризованные запросы или mysql_real_escape_string
после этого цитирования, чтобы остановить обратную косую черту, неверно истолковавшуюся, поскольку escape-литерал из строки, отличной от ANSI.)
К сожалению, PHP preg_quote()
испортит MySQL REGEXP, экранируя знак двоеточия (:), который MySQL REGEXP не понимает
Для этого нет встроенной функции MySQL. Вам просто нужно использовать preg_quote
, прежде чем передавать регулярное выражение в запрос MySQL.
Попробуйте следующее: (PHP)
$tags="test'*\\\r blue";
$tags=mysql_real_escape_string($tags);
$tags=preg_replace('/([.*?+\[\]{}^$|(\)])/','\\\\\1',$tags);
$tags=preg_replace('/(\\\[.*?+\[\]{}^$|(\)\\\])/','\\\\\1',$tags);
Спасибо @bobince хороший ответ. Но у него есть проблема, если вам нужно использовать mysql_real_escape_string
после цитирования, о котором я упомянул в комментарии.
На самом деле preg_quote
и mysql_real_escape_string
имеют перекрытие, и это делает эту проблему! mysql_real_escape_string
не должен \
\
в этом случае. Поэтому я предлагаю:
function regexpEscape(/*string*/ $input) // Can uncomment `string` for PHP 7.0+
{
return addcslashes(preg_quote($input), "\0'\"\n\r\x1A"); // charlist = All characters that escape by real_escape_string except backslash
}
(Для charlist
см. http://php.net/manual/en/mysqli.real-escape-string.php)
Я знаю, что это не идеальный способ. Но не смог найти лучшего способа.