因为 PHP 是一种单线程过程式脚本语言1,所以它不能按照您希望的方式工作。
echo
只有当您调用2时才能触发函数运行,您需要的是一个额外的变量。
$newVariable = preg_replace_callback("#\[%(.{1,20})%\]#", function($matches) {
// Do your thang here
}, $maintext);
// $maintext remains the same as it was when you started, do stuff with it here
// When you come to output the data, do...
echo $newVariable;
还有其他解决这个问题的方法,比如将上面的代码包装在一个可以按需调用的函数中,并使用输出缓冲回调(参见脚注#2),但是在字里行间阅读我认为所有这些都太过分了是一个比较简单的问题。
作为记录,我认为如果您将允许的内容缩小到它的范围内,您的正则表达式会更好,它可能会匹配您不想要的字符。我怀疑这会更好:
#\[%(\w{1,20})%\]#
这将只允许a-zA-Z0-9_
占位符中的字符。
1 其他人可能会告诉您 PHP 现在是一种面向对象的语言,但他们错了。它在底层仍然基本工作,它仍然是一种脚本语言,但现在提供了许多 OO 功能。
2 可以做一些与此非常接近的事情,但这很少是一个好主意,而且对于处理这个问题来说太先进了。
编辑
需要注意的是,当使用任一方法通过回调(e
修饰符或preg_replace_callback()
)传递替换时,回调函数应返回新字符串,而不是直接输出。
这是因为任何语句中的代码都是由内而外执行的,而“内”echo
语句(在回调函数中)会在“外”echo
语句(在preg_replace()
被调用的那一行)之前执行,所以事情的顺序输出将不正确。
例如:
$str = "This is my string which contains a %placeholder%";
echo preg_replace_callback('/%(\w+)%/', function($matches) {
echo "replacement string";
}, $str);
// Wrong - outputs "replacement stringThis is my string which contains a "
echo preg_replace_callback('/%(\w+)%/', function($matches) {
return "replacement string";
}, $str);
// Right - outputs "This is my string which contains a replacement string"