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);