我正在寻找类似于preg_quote的东西,但是对于MySQL regexp语法。
有什么想法吗?
答案 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_quote
和mysql_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)
我知道这不是一种理想的方式,但找不到更好的方法。