Супер базовая система шаблонов

Я хотел бы иметь возможность заменять вещи в файле регулярным выражением, используя следующую схему:

У меня есть массив:

$data = array(
  'title' => 'My Cool Title',
  'content' => ''
)

У меня также есть шаблон (для ясности предположим, что нижеприведенное присвоено переменной $ шаблон)

<html>
<title><% title %></title>
<body><% content %></body>
</html>

Я хотел бы иметь возможность использовать одно регулярное выражение для всего этого, чтобы оно было как можно более общим; Ниже приведен мой удар (который не работает)

$endMarkup = preg_replace('/<% ([a-z]+) %>/',$data["\\1"], $template);

Есть ли чистое решение для помещения данных ассоциативного массива в шаблон по индексу массива?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
496
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Немного поработав заранее, вы можете сделать это с помощью одного вызова preg_replace:

$replacements = array();
foreach ($data as $search => $replacement) {
   $replacements["/<% $search %>/"] = $replacement;
}
$endMarkup = preg_replace(
     array_keys($replacements), 
     array_values($replacements), 
     $template);

С помощью этого метода вы можете просто использовать str_replace ().

Jeremy Ruten 12.01.2009 06:00

Абсолютно. Я бы, наверное, выбрал $ replacements ["/ <%? $ Search?%> / I"] = $ replace; и тогда стоит использовать регулярные выражения.

Allain Lalonde 12.01.2009 06:14

Если вы не можете подтвердить или поручиться за заголовки, используйте preg_quote. print_r (array ("df + g? / 4dd4" => 3));

OIS 12.01.2009 06:19

Вы можете сделать это с помощью preg_replace_callback (). Вот как бы я это сделал:

function get_data($matches) {
    global $data;

    return $data[$matches[1]];
}

$endMarkup = preg_replace_callback('/<% ([a-z]+) %>/', 'get_data', $template);

Или все в одной строке, используя create_function (), если хотите:

$endMarkup = preg_replace_callback('/<% ([a-z]+) %>/', create_function('$matches', 'global $data; return $data[$matches[1]];'), $template);

Вы можете попробовать без регулярного выражения, если хотите. Для этого создана функция str_replace. Если вы не понимаете регулярное выражение, это будет лучшим вариантом для вас.

Данные испытаний:

$data = array(
  'title' => 'My Cool Title',
  'content' => ''
);

$file = <<< EOF
<html>
<title><% title %></title>
<body><% content %></body>
</html>
EOF;

Функция и пример:

function replace_template($template, $data)
{
    $replace = array_fill(0, count($data), '<%% %s %%>');
    $keys = array_map('sprintf', $replace, array_keys($data));
    $output = str_replace($keys, $data, $template);
    return $output;
}

echo replace_template($file, $data);

Почему вы вообще хотите заморачиваться с шаблонами? PHP уже является языком шаблонов. Если вы не пытаетесь исключить возможность выполнения кода, все, что вам нужно, встроено в язык.

Вы можете писать свои шаблоны, используя простой PHP с короткими тегами. Вы можете обернуть все это функцией, чтобы немного ограничить область действия переменной. Вы можете использовать import(), чтобы получить несколько переменных из массива. Вы можете использовать include или require() для обработки загрузки, анализа и вставки значений в файл. Вы можете использовать буферизацию вывода (ob_start() / ob_end()) для обработки захвата вывода в строке. Все встроено, быстро и тщательно протестировано.

Другие вопросы по теме