gpt4 book ai didi

javascript - 如何在 preg_replace_callback 中使用递归

转载 作者:行者123 更新时间:2023-11-27 23:56:47 27 4
gpt4 key购买 nike

我有一个 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} 和 {1}", "第一", "第二");返回“第一和第二”

我想在 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} 和 {1}", "first", "second");返回“第一个和第一个”

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

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

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

最佳答案

您的问题: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} 和 {0}", "only")。我只需从正则表达式中取出索引并在数组中找到它。 (此外,\d\d* 不如 \d+ 易读,但等同于 \d+。)

关于javascript - 如何在 preg_replace_callback 中使用递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32198717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com