PHP用数组元素值替换大括号之间的字符串


PHP replace string between curly brackets with array element value

我有一个内容体被读取,它包含许多字符串,如{{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);