【问题标题】:How to know the match count in preg_replace_callback - PHP如何知道 preg_replace_callback 中的匹配计数 - PHP
【发布时间】:2013-04-10 20:24:21
【问题描述】:

我在 php 中有这段代码 -:

function pregRepler($matches)
{
    * do something
}

$str = preg_replace_callback($reg_exp,'pregRepler',$str);

在函数pregRepler 中,我想知道当前的match number,比如它是第一个匹配还是第二个匹配......

我该怎么做??

【问题讨论】:

  • 我知道这是一个老问题,但从 PHP 5.1.0 开始添加了一个“count”变量。您可以使用它来获取计数。 preg_replace_callback ($regex, callback_function, $subject, $limit, &$count)

标签: php preg-replace-callback


【解决方案1】:

试试这样的:

function pregRepler($matches) {
    static $matchcount = 0;
    // do stuff
    $matchcount++;
}

正如我在my answeryour other question 中提到的那样,这更适用于匿名函数,因为如果您多次调用preg_replace_callback,这将避免出现问题。

【讨论】:

  • @Kolink 你不应该在函数之外定义静态吗?这不会在每次调用时将 $matchcount 重置为 0 吗?
  • @nl-x 不,这个变量是静态的,所以它只会被定义和初始化一次。
  • @M8R-1jmw5r 计算回调外部使用的总数,而不是其中的运行计数。
  • @RayZ 如果我的回答对您有所帮助,请考虑通过单击帖子分数下方的复选标记将其标记为已接受。
【解决方案2】:

您需要在两个变量范围之间共享一个$count 变量,例如使用变量别名:

$callback = function($matches) use (&$count) {
    $count++;
    return sprintf("<%d:%s>", $count, $matches[0]);
};

echo preg_replace_callback($pattern, $callback , $subject, $limit = -1, $count);

在调用之前,$count 等于 0。在调用之后,$count 设置为完成的替换次数。在这两者之间,您可以在回调中计数。您也可以在下次调用时再次设置为零。

See it in action

http://php.net/preg_replace_callback

【讨论】:

    【解决方案3】:
    $repled     = 0;
    function pregRepler($matches)
    {
        * do something
        global $repled;
        $repled++;
    }
    
    $str = preg_replace_callback($reg_exp,'pregRepler',$str);
    

    只需从全局变量中计数。

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 2013-01-17
      • 2019-03-25
      • 2012-08-20
      • 2021-03-20
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多