PHP preg“u replace”回调不替换我的;“火柴”;

PHP preg“u replace”回调不替换我的;“火柴”;,php,regex,preg-replace-callback,Php,Regex,Preg Replace Callback,为什么返回的是原始字符串而不是已编辑的字符串 原始字符串: I cant believe Ed ate [-food-] for breakfast. 替换: preg_replace_callback('/\[\-[a-zA-Z0-9_]\-\]/', 'tag_func', $email_body); function tag_func($matches){ $matches[0] = 'tacos'; return $matches[0]; } 结果所需字符串:

为什么返回的是原始字符串而不是已编辑的字符串

原始字符串:

I cant believe Ed ate [-food-] for breakfast.
替换:

preg_replace_callback('/\[\-[a-zA-Z0-9_]\-\]/', 'tag_func', $email_body);

function tag_func($matches){
     $matches[0] = 'tacos';
     return $matches[0];
}
结果所需字符串:

I cant believe Ed ate tacos for breakfast.
这是我得到的警告:

preg_replace_callback(): Requires argument 2, 'tag_func', to be a valid callback 

您忘记添加
+
,因此它应该匹配多个字符:

preg_replace_callback('/\[-[a-z\d_]+-\]/i', 'tag_func', $email_body);
//                                 ^
在这里看到它的作用:


如果您运行的是5.3,则可以直接向其传递匿名函数:

preg_replace_callback('/\[-[a-z\d_]+-\]/i', function () {
    return 'tacos';
}, $email_body);

这是演示:

这也不适合我。我已经添加了我不断收到的警告。关于解决我的这个难题有什么线索吗?我直接复制了你的演示,但它不起作用。。。这相当令人沮丧。好消息,这确实奏效了!我意识到了我的问题,这是因为我调用了一个公共静态函数。我最终使用了array('classname','GetPlaceholderConverter'),而且效果也很好!我认为这可能与我的php版本有关,但我正在运行5.3.3