将PREG_REPLACE转换为PREG_REPLACE_CALLBACK以查找和替换带有变量的单词

本教程将介绍将PREG_REPLACE转换为PREG_REPLACE_CALLBACK以查找和替换带有变量的单词的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

将PREG_REPLACE转换为PREG_REPLACE_CALLBACK以查找和替换带有变量的单词 教程 第1张

问题描述

我有以下一行代码:

$message = preg_replace('/{{([a-zA-Z_-]+)}}/e', "$$1", $body);

这将用同名变量替换由两个大括号括起来的单词。即{{userName}}被$userName替换。

我正在尝试将其转换为使用PREG_REPLACE_CALLBACK。这是我到目前为止基于Google的代码,但是我真的不确定我在做什么!ERROR_LOG输出显示变量名,包括大括号。

$message = preg_replace_callback(
 "/{{([a-zA-Z_-]+)}}/",
  function($match){
error_log($match[0]);
return $$match[0];
  },
  $body
);

非常感谢您的任何帮助。

推荐答案

函数在PHP中有它们自己的变量作用域,因此您试图替换的任何内容在函数中都不可用,除非您显式地这样做。我建议将您的替换放在一个数组中,而不是单个变量中。这有两个优点--第一,它允许您轻松地将它们放在函数范围内;第二,它提供了内置的白名单机制,这样您的模板就不会意外(或故意)引用不应该公开的变量。

// Don't do this:
$foo = 'FOO';
$bar = 'BAR';

// Instead do this:
$replacements = [
 'foo' => 'FOO',
 'bar' => 'BAR',
];

// Now, only things inside the $replacements array can be replaced.

$template = 'this {{foo}} is a {{bar}} and here is {{baz}}';
$message = preg_replace_callback(
 '/{{([a-zA-Z_-]+)}}/',
 function($match) use ($replacements) {
  return $replacements[$match[1]] ?? '__ERROR__';
 },
 $template
);

echo "$message
";

这将产生:

this FOO is a BAR and here is __ERROR__

好了关于将PREG_REPLACE转换为PREG_REPLACE_CALLBACK以查找和替换带有变量的单词的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。