0

我正在编写一个方法,该方法通过其编号返回函数参数。

protected function parseArgs($str, $args)
{
    return preg_replace('|#(\d)|e', '$args[\\1 - 1]', $str);
}

$str - 带有 '#N' 的字符串,其中 N 是多个参数 $args - 参数数组

所以如果我写 '#1' - 它返回 $arg[0],第一个参数。它适用于字符串参数,整数......但不要使用对象作为参数。在返回字符串Object。我如何使用此功能获取对象?

4

2 回答 2

2

你不能让它像那样工作,因为preg_replace 总是返回一个字符串。事实上,这个版本也未能保留所有其他非字符串值的类型,这意味着在调用之后parseArgs您无法区分 egnull和as 值。false''

也就是说,这个函数的目的是什么?我为什么要写这个

$args = ('foo', 'bar');
$value = parseArgs('#1', $args);

而不是这个?

$args = ('foo', 'bar');
$value = $args[0];
于 2013-02-18T14:23:19.710 回答
0

e修饰符已弃用。不鼓励使用它。

相反,我会将您指向preg_replace_callback() function,它还使您能够从正则表达式替换中调用 PHP 代码,但没有e修饰符中体现的不良做法。

您的原始示例代码试图执行以下操作:

return preg_replace('|#(\d)|e', '$args[\\1 - 1]', $str);
  • 以包含哈希的字符串开头,后跟一个数字
  • 获取$args比数字少一的数组元素的内容。
  • 用元素的内容替换字符串中的数字$args

正如@Jon 所说,这并不是 regex replace 可以用来做的最有用的事情,但如果你确实需要这样做,它可以很容易地完成,并且通过更好的编码实践,使用preg_replace_callback()

preg_replace_callback(
    '|#(\d)|',
    function($matches) use($args) {return $args[$matches[1]-1];},
    $str
);

这里的优点是您现在在替换代码中具有更大的灵活性。

希望有帮助。(我把它放在多行以使其更容易阅读)

请注意,上面的代码假设您使用的是 PHP 5.3 或更高版本。如果您使用的是早期版本,则需要使用create_function()而不是内联函数。

我知道我没有直接回答这个问题,但这没关系,因为@Jon 已经解决了这方面的问题。但我希望回答这将引导您获得更好的代码。

于 2013-02-18T14:40:48.270 回答