【问题标题】:Preg_replace range character classPreg_replace 范围字符类
【发布时间】:2015-07-09 10:58:18
【问题描述】:

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

警告: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 的最后一行。

谁能帮忙?

【问题讨论】:

  • 在最后一个正则表达式中未转义 -

标签: php regex preg-match


【解决方案1】:

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

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

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

这是PCRE Reference的摘录:

如果 POSIX 字符类(见下文)或 an 出现定义单个字符的转义序列以外的转义序列 在需要范围结束字符的地方。例如, [z-\xff] 有效,但 [A-\d][A-[:digit:]] 无效。

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

working regex demo

【讨论】:

    【解决方案2】:

    您忘记在以下位置避开破折号:

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

    应该是:

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

    【讨论】:

      猜你喜欢
      • 2020-06-08
      • 2014-11-15
      • 2012-11-04
      • 2011-03-28
      • 2023-03-25
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多