Функция PHP, чтобы избежать синтаксиса regexp MySQL

Я ищу что-то похожее на preg_quote, но для синтаксиса regexp MySQL.

Любые идеи?

Ответ 1

MySQL regexps - это расширенный вариант POSIX (ERE), доступный в PHP как устаревшие функции ereg_.

К сожалению, в PHP нет ereg_quote, однако специальные символы PCRE являются надмножеством специальных символов ERE, а обратная косая черта с неспецифическим символом пунктуации не наносит ему вреда, поэтому вы можете избежать использования preg_quote безопасно.

(Естественно, вам понадобится параметризованные запросы или mysql_real_escape_string после этого цитирования, чтобы остановить обратную косую черту, неверно истолковавшуюся, поскольку escape-литерал из строки, отличной от ANSI.)

Ответ 2

К сожалению, PHP preg_quote() испортит MySQL REGEXP, экранируя знак двоеточия (:), который MySQL REGEXP не понимает

Ответ 3

Для этого нет встроенной функции MySQL. Вам просто нужно использовать preg_quote, прежде чем передавать регулярное выражение в запрос MySQL.

Ответ 4

Попробуйте следующее: (PHP)

    $tags="test'*\\\r blue";
    $tags=mysql_real_escape_string($tags);
    $tags=preg_replace('/([.*?+\[\]{}^$|(\)])/','\\\\\1',$tags);
    $tags=preg_replace('/(\\\[.*?+\[\]{}^$|(\)\\\])/','\\\\\1',$tags);

Ответ 5

Спасибо @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)

Я знаю, что это не идеальный способ. Но не смог найти лучшего способа.