Я хотел бы иметь возможность заменять вещи в файле регулярным выражением, используя следующую схему:
У меня есть массив:
$data = array(
'title' => 'My Cool Title',
'content' => ''
)
У меня также есть шаблон (для ясности предположим, что нижеприведенное присвоено переменной $ шаблон)
<html>
<title><% title %></title>
<body><% content %></body>
</html>
Я хотел бы иметь возможность использовать одно регулярное выражение для всего этого, чтобы оно было как можно более общим; Ниже приведен мой удар (который не работает)
$endMarkup = preg_replace('/<% ([a-z]+) %>/',$data["\\1"], $template);
Есть ли чистое решение для помещения данных ассоциативного массива в шаблон по индексу массива?






Немного поработав заранее, вы можете сделать это с помощью одного вызова preg_replace:
$replacements = array();
foreach ($data as $search => $replacement) {
$replacements["/<% $search %>/"] = $replacement;
}
$endMarkup = preg_replace(
array_keys($replacements),
array_values($replacements),
$template);
Абсолютно. Я бы, наверное, выбрал $ replacements ["/ <%? $ Search?%> / I"] = $ replace; и тогда стоит использовать регулярные выражения.
Если вы не можете подтвердить или поручиться за заголовки, используйте preg_quote. print_r (array ("df + g? / 4dd4" => 3));
Вы можете сделать это с помощью 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()) для обработки захвата вывода в строке. Все встроено, быстро и тщательно протестировано.
С помощью этого метода вы можете просто использовать str_replace ().