用于转义 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_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)

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

【讨论】:

转义正则表达式应该没有问题,然后使用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,您可以像这样使用CONCATWHERE field REGEXP CONCAT('regexp part 1', ?, 'regexp part 2') 并将preg_quote($field) 绑定到? 参数。【参考方案5】:

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

【讨论】:

preg_quote 不会转义 MySQL 所需的 &

以上是关于用于转义 MySQL 正则表达式语法的 PHP 函数的主要内容,如果未能解决你的问题,请参考以下文章

前端学PHP之正则表达式基础语法

前端学PHP之正则表达式基础语法

python--6re模块

python之re模块

PHP中的正则

php正则表达式