4

我正在使用这个正则表达式计算一些特殊字符(如欧元符号)的数量:$textpreg_match_all

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

出于某种奇怪的原因,PHP 要求我提供第三个参数但根据 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

4 回答 4

4

虽然第三个参数在 5.4.0 中成为可选的,就像其他人已经说过的那样,但是即使你传递了第三个参数,你的代码也不会编译,因为你说你传递了 PREG_PATTERN_ORDER 标志,但是第三个参数应该是接收匹配的数组,第四个参数是旗帜。

使用类似以下内容

<?php
$dummy = array();
echo("Result = ".preg_match_all('/[\[|\]|x\{|}|\\|\^|\||~]/', $text, $dummy));
?>
于 2012-05-28T18:28:48.947 回答
2

从 PHP 5.4.0 开始,它成为可选的。

变更日志

5.4.0 匹配参数变为可选。

于 2012-05-28T18:24:41.543 回答
1

返回值preg_match_all是一个 int → 匹配数。匹配文本将填充到第三个参数中。

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

// correct
$num = preg_match_all('/[\[|\]|€\{|}|\\|\^|\||~]/u', $text, $specials);
于 2012-05-28T18:28:09.407 回答
1

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

于 2012-05-28T18:24:23.017 回答