用于转义 MySQL 正则表达式语法的 PHP 函数
Posted
技术标签:
【中文标题】用于转义 MySQL 正则表达式语法的 PHP 函数【英文标题】:PHP function to escape MySQL regexp syntax 【发布时间】:2011-04-30 18:22:47 【问题描述】:我正在寻找类似于 preg_quote 的东西,但使用的是 mysql regexp 语法。
有什么想法吗?
【问题讨论】:
What's the best way to escape user input for Regular Expressions in MySQL?的可能重复 【参考方案1】:感谢@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)
我知道这不是一个理想的方法,但找不到更好的方法。
【讨论】:
转义正则表达式应该没有问题,然后使用mysql_real_escape_string
转义【参考方案2】:
试试这个:(PHP)
$tags="test'*\\\r blue";
$tags=mysql_real_escape_string($tags);
$tags=preg_replace('/([.*?+\[\]^$|(\)])/','\\\\\1',$tags);
$tags=preg_replace('/(\\\[.*?+\[\]^$|(\)\\\])/','\\\\\1',$tags);
【讨论】:
【参考方案3】:遗憾的是,PHP 的 preg_quote()
通过转义 MySQL 的 REGEXP 不理解的冒号 (:) 来搞乱 MySQL REGEXP
【讨论】:
那么 preg_quote 然后用非转义冒号替换所有转义冒号的最佳方法是什么? 我认为这个答案不正确。用 MySQL 试试:$statement = $wpdb->prepare( "SELECT %s REGEXP %s", 'hello:you', 'hello\\:you' )
【参考方案4】:
MySQL 正则表达式是“扩展的”POSIX 变体 (ERE),在 PHP 中作为已弃用的 ereg_
函数提供。
不幸的是,PHP 中没有 ereg_quote
,但是 PCRE 的特殊字符是 ERE 特殊字符的超集,反斜杠转义非特殊标点字符不会对它造成伤害,所以您可以 安全地使用preg_quote
。
(当然,您将需要参数化查询或mysql_real_escape_string
在引用之后,以防止反斜杠被误解为 MySQL 的非 ANSI 标准字符串文字转义。)
【讨论】:
小警告:空控制字符。preg_quote
将其转义为 \000
,这是 MySQL 无法识别的格式。但是 MySQL 的正则表达式引擎无论如何也无法处理空字符,它将它们作为终止符。
我不得不使用 str_replace('?', '\\?', preg_quote()),因为 preg_quote() 可以产生 ?当它不知道特殊的 UTF8 字符时。和 ?需要在正则表达式中转义。
有问题! mysql_real_escape_string
将转义反斜杠字符。此功能会导致所有反斜杠再次转义(如果您在引用后使用mysql_real_escape_string
)!
@Mir-Ismaili 是的,如果您将正则表达式注入 SQL 查询字符串文字中,您应该只使用mysql_real_escape_string
,在这种情况下,您确实需要额外的反斜杠。通常,最好使用参数化查询并避免额外的转义。
要完成答案:要使用参数化 REGEXP,您可以像这样使用CONCAT
:WHERE field REGEXP CONCAT('regexp part 1', ?, 'regexp part 2')
并将preg_quote($field)
绑定到?
参数。【参考方案5】:
没有用于此的原生 MySQL 函数。在将正则表达式传递给 MySQL 查询之前,您可能只需要使用 preg_quote
。
【讨论】:
preg_quote
不会转义 MySQL 所需的 &
。以上是关于用于转义 MySQL 正则表达式语法的 PHP 函数的主要内容,如果未能解决你的问题,请参考以下文章