【问题标题】:How to make use of recursion in preg_replace_callback如何在 preg_replace_callback 中使用递归
【发布时间】:2015-08-25 08:08:23
【问题描述】:

我有一个 JavaScript 函数(不是纯 JavaScript)

function formatString () {
    var args = jQuery.makeArray(arguments).reverse();
    var str = args.pop();

    return str.replace(/{\d\d*}/g, function () {
       return args.pop();
    }); 
}

我用来格式化字符串,例如 formatString("{0} and {1}", "first", "second"); 返回"first and second"

我想在 php 中复制相同的功能,我有以下功能:

function formatString() {
   if(func_num_args() > 1) {
      $args = array_reverse(func_get_args());
      $input = array_pop($args);
   }
   return preg_replace_callback('/{\d\d*}/', function() use ($args) {
      return array_pop($args);
   }, $input);
}

但是,在这种情况下formatString("{0} and {1}", "first", "second"); 返回"first and first"

与每次匹配都执行回调的 JavaScript 版本的函数不同,php 变体似乎只执行一次回调。

我正在考虑对 formatString 进行递归调用作为回调,但由于 preg_replace_callback 使用其自己的参数调用回调(此处为匹配数组),因此我在递归方面遇到了挑战。

请告知如何最好地利用回调或任何替代解决方案来使用preg_replace_callback。全局变量的使用是不可能的。

【问题讨论】:

    标签: javascript php jquery


    【解决方案1】:

    您的问题:PHP 是按值传递的。考虑一下:

    function pop_it($array) {
      array_pop($array);
      print_r($array);
    }
    
    $array = array(1, 2);
    print_r($array);
    // => Array([0] => 1, [1] => 2)
    
    pop_it($array);
    // => Array([0] => 1)
    
    print_r($array);
    // => Array([0] => 1, [1] => 2)
    

    你的函数调用得很好。但总是有相同的论点,因为$args 永远不会改变。不在重要的地方 - 在回调之外。您需要传递引用才能使更改生效。

    更改为function pop_it(&$array)(或use (&$args)),然后......发生了一些事情。

    但是,我不喜欢这种方法,因为它会为formatString("{1} and {0}", "second", "first")formatString("{0} and {0}", "only") 做错事。我只是从正则表达式中提取索引并在数组中找到它。 (另外,\d\d* 的可读性不如\d+,但等同于\d+。)

    【讨论】:

    • 感谢您强调 PHP 是按值传递的事实。显然,修改为&$arg 似乎可以解决问题并产生预期的结果。请告知您为什么说它会对formatString("{1} and {0}", "second", "first") 做错事。
    • 我希望它返回"first and second",但它返回"second and first"。如果你要忽略它们,数字有什么意义?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多