PHP заменяет строку между фигурными скобками значением элемента массива

У меня есть контент, который читается, и он содержит множество строк, таких как {{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тоже есть пара сотен элементов.

3 ответа

Решение

Ты можешь использовать 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);
Другие вопросы по тегам