Супер базовая система шаблонов - PullRequest
1 голос
/ 12 января 2009

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

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

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

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 12 января 2009

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

$replacements = array();
foreach ($data as $search => $replacement) {
   $replacements["/<% $search %>/"] = $replacement;
}
$endMarkup = preg_replace(
     array_keys($replacements), 
     array_values($replacements), 
     $template);
2 голосов
/ 12 января 2009

Вы можете попробовать без регулярных выражений, если хотите. Для этого была создана функция 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);
1 голос
/ 12 января 2009

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

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

0 голосов
/ 12 января 2009

Вы можете сделать это с помощью 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...