Preg_replace 范围字符 class

Preg_replace range character class

它是这样说的,我想知道为什么会这样。以前没有过。

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

$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.

谁能帮忙?

\+?[0-9][0-9()-\s+]{4,20}[0-9] 中,您放错了连字符,正则表达式引擎认为您试图在 )\s 之间建立一个范围。

shorthand class不可能出现在范围边界。

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

这里是 PCRE Reference 的摘录:

An error is generated if a POSIX character class (see below) or an escape sequence other than one that defines a single character appears at a point where a range ending character is expected. For example, [z-\xff] is valid, but [A-\d] and [A-[:digit:]] are not.

使用 \+?[0-9][0-9()\s+-]{4,20}[0-9],或像 \+?[0-9][0-9()\-\s+]{4,20}[0-9].

这样的连字符转义

working regex demo

您忘记转义破折号了:

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

应该是:

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