0

只要有 [%xxx%] (如果愿意,可以充当占位符),我都会尝试运行一个函数,例如:

Bla bla bla blabla. Blablabla bla bla.
[%hooray%]
Blabla hey bla bla. [%yay%] blabla bla.

我几乎是一个 PHP 初学者,但我设法破解了我的头脑并想出了以下内容(对我来说是的 - 我不知何故设法理解了正则表达式的基础知识!):

$maintext = preg_replace("#\[%(.{1,20})%\]#", "display_products('$1')"), $maintext);
echo $maintext; 

我尝试使用e修饰符,我尝试使用 preg_replace_callback,这一切都有些工作 - 但我不需要在回显 $maintext 变量之前运行该函数。

对这些人有帮助吗?

编辑 正则表达式不是问题 - 工作正常。只有当我回显 $maintext 时,我才需要弄清楚如何运行该函数... preg_replace_callback 立即运行该函数...

4

3 回答 3

0

因为 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"
于 2012-07-18T08:51:50.103 回答
0

如果您有一个多次使用 echo 的脚本并且您希望修改打印的文本,您可以使用输出缓冲:

ob_start();
/*
 * Lots of php code
*/

$maintext = ob_get_clean(); // now you capture the content in $maintext 

// than you modify the output
$maintext = preg_replace("#\[%(.{1,20})%\]#", "display_products($1)", $maintext);
echo $maintext;
于 2012-07-18T09:18:07.010 回答
0

ob_start 接受一个回调函数,你可以阅读更多关于这个主题: 让所有 PHP 文件输出在显示之前通过一个“过滤文件”

于 2012-07-18T11:40:01.583 回答