为什么preg_match_all强制我提供第三个可选参数?

时间:2012-05-28 18:20:15

标签: php regex preg-match preg-match-all

我使用$text和这个正则表达式计算preg_match_all中某些特殊字符(如欧元符号)的数量:

preg_match_all('/[\[|\]|€\{|}|\\|\^|\||~]/u', $text);

由于某些奇怪的原因,PHP要求我提供第三个参数。但根据documentation of preg_match_all,它应该是可选的:

  

警告:preg_match_all()需要至少3个参数,2个给定。

如果我提供PREG_PATTERN_ORDER(甚至不知道为什么我应该)我得到:

  

无法通过引用传递参数3.

那么,我的代码出了什么问题?如果需要,这是整个功能:

public function getMessageCount($text)
{
    $specials   = preg_match_all('/[\[|\]|€\{|}|\\|\^|\||~]/u', $text)
    $characters = strlen($text) + $specials;

    if(in_array(strtolower($this->method), self::$classic_plans)) :

        if($characters >= 0   && $characters <= 160) return 1;
        if($characters >= 161 && $characters <= 306) return 2;
        if($characters >= 307 && $characters <= 459) return 3;
        if($characters >= 460 && $characters <= 612) return 4;

        return 5;

    endif;

    if(in_array(strtolower($this->method), self::$basic_plans)) :

        if($characters >= 0    && $characters <= 160)  return 1;
        if($characters >= 161  && $characters <= 312)  return 2;
        if($characters >= 313  && $characters <= 468)  return 3;
        if($characters >= 469  && $characters <= 624)  return 4;
        if($characters >= 625  && $characters <= 780)  return 5;
        if($characters >= 781  && $characters <= 936)  return 6;
        if($characters >= 937  && $characters <= 1092) return 7;
        if($characters >= 1093 && $characters <= 1248) return 8;

        return 9;

    endif;

    return in_array(strtolower($this->method), self::$zero_plans) ? 1 : null;
}

4 个答案:

答案 0 :(得分:4)

虽然第3个参数在5.4.0中变成了可选项,但其他人已经说过但是你的代码也没有编译,即使你传递了第3个参数,因为你说你传递了PREG_PATTERN_ORDER标志,但第3个参数应该是接收到的数组匹配和第4个参数是标志。

使用类似following

的内容
<?php
$dummy = array();
echo("Result = ".preg_match_all('/[\[|\]|x\{|}|\\|\^|\||~]/', $text, $dummy));
?>

答案 1 :(得分:2)

它从PHP 5.4.0开始变为可选。

  

<强>更新日志

     

5.4.0 matches参数变为可选。

答案 2 :(得分:1)

查看您提供的链接中的更改日志。之后,检查您的PHP版本;)

答案 3 :(得分:1)

返回值preg_match_all是一个int→匹配数。匹配文本将填入3 rd 参数。

// incorrect
$specials = preg_match_all('/[\[|\]|€\{|}|\\|\^|\||~]/u', $text);      

// correct
$num = preg_match_all('/[\[|\]|€\{|}|\\|\^|\||~]/u', $text, $specials);