PHP:preg_replace(),`e`-modifier和object

时间:2013-02-18 14:21:14

标签: php regex preg-replace

我正在编写一个方法,它通过数字返回一个函数参数。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

那说,无论如何,这个功能的目的是什么?我为什么要写这个

$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);
  • 以包含哈希后跟数字
  • 的字符串开头
  • 抓取编号为1的$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已经解决了这方面的问题。但我希望回答这个问题会引导你走向更好的代码。