Preg_replace范围字符类

时间:2015-07-09 10:58:18

标签: php regex preg-match

这是在说这个,我想知道为什么会这样。它之前没有发生过。

警告:preg_replace():编译失败:第158行的messenger.php中偏移量为16的字符类中的无效范围

$pattern = array(
             "/[^@\s]*@[^@\s]*\.[^@\s]*/",
            "/[a-zA-Z]*[:\/\/]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i",
            '/\+?[0-9][0-9()-\s+]{4,20}[0-9]/'
        );
        $replacement    = array(
            "[removed email]",
            "[removed url]",
            "[removed phone]"
        );
        $message_text   = preg_replace($pattern, $replacement, $message_text);

158行是$ message_text的最后一行。

谁可以提供帮助?

2 个答案:

答案 0 :(得分:1)

)中,您错放了连字符,正则表达式引擎认为您正在尝试构建\s[z-\xff]之间的范围。

速记类不可能出现在范围边界。

这是Debuggex.com中出现的错误:

enter image description here

以下是PCRE Reference

的摘录
  

如果是POSIX字符类(见下文)或,则会产生错误          出现除了定义单个字符的转义序列之外的转义序列          在预期范围结束字符的点。例如,          [A-\d]有效,但[A-[:digit:]]\+?[0-9][0-9()\s+-]{4,20}[0-9]不是。

使用\+?[0-9][0-9()\-\s+]{4,20}[0-9],或转义连字符{{1}}。

请参阅working regex demo

答案 1 :(得分:0)

你忘了逃避冲刺:

'/\+?[0-9][0-9()-\s+]{4,20}[0-9]/'
//       here __^

应该是:

'/\+?[0-9][0-9()\-\s+]{4,20}[0-9]/'