我正在编写一个方法,它通过数字返回一个函数参数。
protected function parseArgs($str, $args)
{
return preg_replace('|#(\d)|e', '$args[\\1 - 1]', $str);
}
$ str - 带有'#N'的字符串,其中N是一个参数个数 $ args - 参数数组
所以如果我写'#1' - 它会返回第一个参数$ arg [0]。它适用于字符串参数,整数......但是不能将object作为参数使用。在返回字符串Object
中。
如何使用此功能获取对象?
答案 0 :(得分:2)
你不能让它像那样工作,因为preg_replace
总是返回一个字符串。实际上,此版本也无法保留所有其他非字符串值的类型,这意味着在调用parseArgs
之后,您无法区分null
,false
和''
作为值。
那说,无论如何,这个功能的目的是什么?我为什么要写这个
$args = ('foo', 'bar');
$value = parseArgs('#1', $args);
而不是这个?
$args = ('foo', 'bar');
$value = $args[0];
答案 1 :(得分:0)
不推荐使用e
修饰符。不鼓励使用它。
相反,我会指向preg_replace_callback() function
,这也使您能够从正则表达式替换中调用PHP代码,但没有包含在e
修饰符中的不良实践。
您的原始示例代码尝试执行以下操作:
return preg_replace('|#(\d)|e', '$args[\\1 - 1]', $str);
$args
数组元素的内容。$args
元素的内容。正如@Jon所说,这并不是正则表达式替换可能用于的最有用的东西,但是如果你确实需要这样做,它可以很容易地完成,并且使用更好的编码实践,使用{ {1}}:
preg_replace_callback()
这里的优势在于您现在可以在替换代码中获得更大的灵活性。
希望有所帮助。 (我把它放在多行上以便于阅读)
请注意,上面的代码假设您使用的是PHP 5.3或更高版本。如果您使用的是早期版本,则需要使用preg_replace_callback(
'|#(\d)|',
function($matches) use($args) {return $args[$matches[1]-1];},
$str
);
而不是内联函数。
我知道我没有直接回答这个问题,但是没关系,因为@Jon已经解决了这方面的问题。但我希望回答这个问题会引导你走向更好的代码。