@arturka_v_10

Как сделать множественную автозамену в буферизации вывода на PHP?

Смысл в том что у меня есть текста в которых будут содержаться {{ TEXT }} и прочие {{ LINK.CONTACT }} вставные вещи.

В php сейчас для каждой такой штуковины у меня прописана строка.
$_buf = array(
	"SERVICE" => "/page/uslugi",
	"CONTACT" => "/contact",
	"EMAIL" => "email@domain.zone",
	"TG.CANNEL" => "https://t.me/cannel",
	"TG.PERS" => "https://t.me/",
	"VK.PERS" => "https://vk.com/id",
	"VK.GROUP" => "https://vk.com/group"
);

$buffer = ob_get_contents();
$buffer = str_replace("{{ LINK.CONTACT }}",$_buf["CONTACT"],$buffer);
$buffer = str_replace("{{ LINK.USLUGI }}",$_buf["SERVICE"],$buffer);
$buffer = str_replace("{{ EMAIL }}",$_buf["EMAIL"],$buffer);

ob_end_clean();
echo $buffer;


Вопрос как сократить? циклом не циклом. Ну т.е чтобы это как-то разбиралось. Пробовал вот такую мешанину, не прокатило:
while(list($name,$val)){
	//if(is_string($val)) {
	//	$buffer = str_replace('{{ '.$_buf[$name].' }}',$buffer);
	//}
}
$matching_cells = array();
foreach ($buffer as $key => $value){
    $matching_cells[$value] = $key;
}

$matching_cells = array();
foreach ($_buf as $key => $value){
	
	$pref = "{{ ";
	$posf = " }}";
	if (strpos($pref.$key.$posf, $buffer) !== false) {
		//echo 'true';
		$buffer = str_replace("{{ ".$key." }}",$_buf[$key],$buffer);
	}
}

ob_end_clean();
echo $buffer;
  • Вопрос задан
  • 60 просмотров
Решения вопроса 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
$_buf = array(
  "LINK.USLUGI" => "/page/uslugi",
  "LINK.CONTACT" => "/contact",
  "EMAIL" => "email@domain.zone",
  "TG.CANNEL" => "https://t.me/cannel",
  "TG.PERS" => "https://t.me/",
  "VK.PERS" => "https://vk.com/id",
  "VK.GROUP" => "https://vk.com/group"
);

$buffer = ob_get_contents();
foreach($_buf as $k => $v)
{
    $buffer = str_replace("{{ {$k} }}", $v, $buffer);
}

ob_end_clean();
echo $buffer;


Так не пробовали?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rPman
str_replace поддерживает массивы в качестве аргумента что заменять и на что заменять
$buffer = str_replace(
  ["{{ LINK.CONTACT }}","{{ LINK.USLUGI }}","{{ EMAIL }}"],
  [$_buf["CONTACT"],$_buf["SERVICE"],$_buf["EMAIL"]],
$buffer);

Так же, если заменяется всегда на элемент из $_buf то можно наружу вынести массив
[
"{{ LINK.CONTACT }}"=>"CONTACT",
"{{ LINK.USLUGI }}"=>"SERVICE",
"{{ EMAIL }}"=>"EMAIL",
]
и заменять его с помощью preg_replace_callback

p.s. и вообще зачем изобретать новый шаблонизатор, если php это и есть готовый язык шаблонов
пиши свои шаблоны в формате php, где элементы вставляются с помощью <?=$_BUF["EMAIL"]; ?>, и тебе останется только include($template_name.".php"), подготовив перед этим содержимое $_BUF
если тебе надо хранить шаблоны не в файлах, то пользуйся eval

Осторожно, шаблоны не должны быть доступны пользователям, так как имеют полный доступ к серверу
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы