PHP函数来逃避MySQL regexp语法

时间:2010-10-26 13:33:47

标签: php mysql regex escaping

我正在寻找类似于preg_quote的东西,但是对于MySQL regexp语法。

有什么想法吗?

5 个答案:

答案 0 :(得分:11)

MySQL regexp是'扩展'POSIX变体(ERE),在PHP中可用作已弃用的ereg_函数。

不幸的是PHP中没有ereg_quote,但是PCRE的特殊字符是ERE特殊字符的超集,反斜杠 - 逃避非特殊标点字符不会对其造成伤害,所以可以< / em>安全地使用preg_quote

(当然,在引用之后你需要参数化查询或mysql_real_escape_string ,以阻止反斜杠被误解为MySQL的非ANSI标准字符串文字转义。)

答案 1 :(得分:5)

可悲的是,PHP的preg_quote()通过转义MySQL的REGEXP不理解的冒号(:)来弄乱MySQL REGEXP

答案 2 :(得分:1)

没有原生MySQL功能。在将正则表达式传递给MySQL查询之前,您可能只需要使用preg_quote

答案 3 :(得分:1)

试试这个:(PHP)

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

答案 4 :(得分:0)

感谢@bobince's good answer。但如果您在引用后需要使用mysql_real_escape_string,那么就会出现问题,我在评论中提到过它。

实际上preg_quotemysql_real_escape_string有重叠,这就产生了这个问题!在这种情况下, mysql_real_escape_string一定不能逃避\ 。所以我建议:

function regexpEscape(/*string*/ $input) { // 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

我知道这不是一种理想的方式,但找不到更好的方法。