【问题标题】:php: Why preg_replace_callback does not allow built in php functions, just anonymous user functions?php: 为什么 preg_replace_callback 不允许内置 php 函数,只允许匿名用户函数?
【发布时间】:2012-09-13 09:50:15
【问题描述】:

这不起作用,并输出一个空字符串:

$check["pattern"] = "correct";
$text = "Could this be correct?";
echo preg_replace_callback($check["pattern"],ucfirst,$text);

使用内置函数会很好。事实上,一般回调确实允许按照http://php.net/manual/en/language.types.callable.php 的内置函数,但不允许 preg_replace_callback。可能是对 php 的功能请求?

【问题讨论】:

  • 我相信你听说过strpos,但我只是把它放在那里......
  • 将“ucfirst”放在引号中是否也不起作用? (因为它是一个字符串...)
  • 是的,谢谢,这只是一个虚拟示例。我在现实生活中为此使用了适当的正则表达式:P

标签: php callback callable preg-replace-callback


【解决方案1】:

您的代码应该触发通知和警告:

  • 注意:使用未定义的常量 ucfirst - 假定为“ucfirst”
  • 警告:preg_replace_callback():分隔符不能是字母数字或反斜杠

如果没有,您需要检查您的 PHP 错误报告设置。借助错误消息修复代码:

$check["pattern"] = "/correct/";
$text = "Could this be correct?";
echo preg_replace_callback($check["pattern"],'ucfirst',$text);

...我们得到这个:

警告:ucfirst() 期望参数 1 是字符串,给定数组

所以使用内置回调函数可以正常工作。然而,正如manual page for ucfirst() 解释的那样,该函数需要一个string,而不是一个数组。而且,正如manual page for preg_replace_callback() 解释的那样:

将被调用并传递主题字符串中匹配元素的 array 的回调。

总结一下:这不是一个明智的功能请求,而是您的代码中的一个错误;-)

【讨论】:

    【解决方案2】:

    它适用于所有功能。问题是这些函数需要某些参数。 ucfirst 需要字符串作为输入,但 preg_replace_callback 正在传递一个匹配数组。

    所以...如果您有一个签名与preg_replace 回调签名兼容的内置函数,它就可以工作。但不,并非所有内置函数都有兼容的签名。

    【讨论】:

    • 谢谢,另一个很好的解释。 Alvaro 是第一个,所以我希望我能接受 :)
    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2013-03-03
    • 1970-01-01
    相关资源
    最近更新 更多