我有一个内容体被读取,它包含许多字符串,如{{some_text}}
,我要做的是找到所有这些事件,并将它们替换为数组中的另一个值,例如$text["some_text"]
。
我试过使用preg_replace,但不确定我如何在括号之间找到文本并在替换值中使用它。
$body = "This is a body of {{some_text}} text from a book.";
$text["some_text"] = "really cool";
$parsedBody = preg_replace("'[{].*[}]/U", $text[""], $body);
正如你所看到的,我试图从字符串中获得some_text
文本,并用它来调用数组中的元素,这个例子是非常基本的,因为$body
值要大得多,$text
也有几百个元素。
您可以使用preg_replace_callback
和使用捕获组([^}]+)
来查找数组$text
中的索引:
$repl = preg_replace_callback('/{{([^}]+)}}/', function ($m) use ($text) {
return $text[$m[1]]; }, $body);
//=> This is a body of really cool text from a book.
use ($text)
语句将$text
的引用传递给匿名的function
如何做它周围的另一种方式-而不是找到所有{{...}}
占位符和查找它们的值,遍历所有的值,并替换像这样匹配的占位符:
foreach ($text as $key => $value) {
$placeholder = sprintf('{{%s}}', $key);
$body = str_replace($placeholder, $value, $body);
}
你甚至可以把它包装成一个函数:
function populatePlaceholders($body, array $vars)
{
foreach ($vars as $key => $value) {
$placeholder = sprintf('{{%s}}', $key);
$body = str_replace($placeholder, $value, $body);
}
return $body;
}
只是为了好玩,按原样使用您的数组:
$result = str_replace(array_map(function($v){return '{{'.$v.'}}';}, array_keys($text)),
$text, $body);
或者如果你的数组是$text['{{some_text}}']
,那么只需:
$result = str_replace(array_keys($text), $text, $body);