警告:preg_replace_callback()[function.preg-replace-callback]:编译失败:偏移量为18的字符类中的无效范围

时间:2014-09-23 15:54:03

标签: php

 function replaceQueryParams($string)
{
    $string = preg_replace_callback(
        '/\[\[([A-Za-z0-9_-\s]*)\]\]:(.*?):([10]*)/',
        array($this, 'getQueryParamsMatches'),
        $string
    );
    return $string;
}

当我尝试运行以下代码时,它会抛出错误。

1 个答案:

答案 0 :(得分:0)

在字符类中使用它们时需要转义破折号:

'/[[([A-Za-z0-9_\-\s])]]:(.?):([10]*)/'

Konrad Rudolph从this answer引述:

  

连字符通常是正则表达式中的普通字符。只有当它在一个组表达式中并且在两个其他字符之间时才会有特殊意义。

问题的关键在于正则表达式相信字符类的这一部分:_-\s表示字符范围(如[A-Z][a-z]中所示) 无效,因此错误。

正则表达式引擎将连字符视为字符范围的一部分,如果它包含在字符类的开头或结尾处,那么这两个连字符也适用于您:< / p>

'/[[([A-Za-z0-9_\s-])]]:(.?):([10]*)/'
'/[[([-A-Za-z0-9_\s])]]:(.?):([10]*)/'