我正在寻找类似于 preg_quote 的东西,但适用于 MySQL 正则表达式语法。
有任何想法吗?
有任何想法吗?
MySQL正则表达式使用的是“扩展”POSIX变体(ERE),在PHP中作为已弃用的ereg_
函数提供。
不幸的是,在PHP中没有ereg_quote
函数,但PCRE的特殊字符是ERE特殊字符的超集,并且对非特殊标点字符进行反斜杠转义不会损害它,因此您可以安全地使用preg_quote
。
(当然,在引用后,您需要使用参数化查询或mysql_real_escape_string
来防止反斜杠被解释为MySQL的非ANSI标准字符串字面量转义字符。)
preg_quote
将其转义为\000
,但MySQL无法识别这种格式。不过,MySQL的正则表达式引擎本来就无法处理空字符,它们会被视为终止符。 - bobincemysql_real_escape_string
将转义反斜杠字符。这个特性会导致所有反斜杠再次被转义(如果您在引用后使用mysql_real_escape_string
)! - Mir-Ismailimysql_real_escape_string
,在这种情况下,您确实需要额外的反斜杠。通常,最好使用参数化查询并避免需要额外转义。 - bobinceCONCAT
:WHERE field REGEXP CONCAT('regexp part 1', ?, 'regexp part 2')
并将 preg_quote($field)
绑定到 ?
参数。 - Ruslan Stelmachenko很遗憾,PHP的preg_quote()
函数通过转义冒号符号(:)破坏了MySQL正则表达式,而MySQL的正则表达式无法理解这种转义符号。
$statement = $wpdb->prepare( "SELECT %s REGEXP %s", 'hello:you', 'hello\\:you' )
- Flimm $tags="test'*\\\r blue";
$tags=mysql_real_escape_string($tags);
$tags=preg_replace('/([.*?+\[\]{}^$|(\)])/','\\\\\1',$tags);
$tags=preg_replace('/(\\\[.*?+\[\]{}^$|(\)\\\])/','\\\\\1',$tags);
这方面没有原生的MySQL函数。在将正则表达式传递给MySQL查询之前,您可能只需要使用preg_quote
。
preg_quote
不会转义 &
,而 MySQL 需要它。 - Flimm感谢@bobince的好答案。但是如果您需要在引用后使用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)
我知道这不是最理想的方法,但找不到更好的方法。
mysql_real_escape_string
转义应该不会有问题。 - Flimm