Я ищу что-то похожее на preg_quote, но для синтаксиса regexp MySQL.
Есть идеи?
MySQL regexps – это расширенный вариант POSIX (ERE), доступный в PHP как устаревшие функции ereg_
.
К сожалению, в PHP нет ereg_quote
, однако специальные символы PCRE являются надмножеством специальных символов ERE, а обратная косая черта с неспецифическим символом пунктуации не наносит ему вреда, поэтому вы можете избежать использования preg_quote
безопасно.
(Естественно, вам понадобятся параметризованные запросы или mysql_real_escape_string
после этого цитирования, чтобы остановить обратную косую черту, неверно истолковавшуюся, поскольку mysql_real_escape_string
-литерал из строки, отличной от ANSI.
К сожалению, preg_quote()
PHP preg_quote()
MySQL REGEXP, preg_quote()
знак двоеточия (:), который REGEXP MySQL не понимает
Для этого нет встроенной функции 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
этом случае 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 )
Я знаю, что это не идеальный путь. Но не смог найти лучшего способа.