代码之家  ›  专栏  ›  技术社区  ›  akosch

用于转义mysql regexp语法的php函数

  •  11
  • akosch  · 技术社区  · 15 年前

    我在寻找类似preg_引号的东西,但是对于mysql regexp语法。

    有什么想法吗?

    5 回复  |  直到 7 年前
        1
  •  11
  •   bobince    15 年前

    mysql regexps是扩展的posix变量(ere),在php中作为不推荐使用的变量提供 ereg_ 功能。

    不幸的是,没有 ereg_quote 然而,在PHP中,pcre的特殊字符是re的特殊字符的超集,反斜杠转义非特殊标点字符不会对它造成损害,因此 可以 不要使用 preg_quote 安全。

    (当然,您需要参数化查询或 mysql_real_escape_string 之后 这句话是为了阻止反斜杠被错误地解释为MySQL的非ANSI标准字符串字面转义。)

        2
  •  5
  •   Vikdor    13 年前

    遗憾的是,PHP preg_quote() 通过转义mysql的regexp不理解的冒号(:)来扰乱mysql regexp

        3
  •  1
  •   Ruel    15 年前

    没有本地的mysql函数。你可能只需要使用 preg_quote 在将正则表达式传递到MySQL查询之前。

        4
  •  1
  •   seizu    13 年前

    试试这个:(php)

        $tags="test'*\\\r blue";
        $tags=mysql_real_escape_string($tags);
        $tags=preg_replace('/([.*?+\[\]{}^$|(\)])/','\\\\\1',$tags);
        $tags=preg_replace('/(\\\[.*?+\[\]{}^$|(\)\\\])/','\\\\\1',$tags);
    
        5
  •  0
  •   Mir-Ismaili    7 年前

    感谢 @bobince's good answer . 但是如果你需要使用它会有问题 mysql_real_escape_string 在引用之后,我在评论中提到了它。

    事实上 preg_quote mysql_real_escape_字符串 有重叠,这就产生了这个问题! mysql_real_escape_字符串 不能逃跑 \ 在这种情况下 . 所以我建议:

    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 )

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

    推荐文章