<?php
function render_template($template, $variables) {
    $replacements = array();
    
    // Обрабатываем список переменных.
    foreach ($variables as $key => $value) {
        
        if (strncmp($key, "html_", 5) != 0) {
          // Экранируем спецсимволы, если имя переменной НЕ начинается с html_ (т.е., если мы вставляем не HTML-код).
          $value = htmlspecialchars($value, ENT_COMPAT, "UTF-8");
        }
        
        // Декорируем имя и добавляем в список замен.
        $replacements['%' . $key . '%'] = $value;
    }
    
    // Заменяем все.
    return str_replace(array_keys($replacements), array_values($replacements), $template);
}

// Некие данные (например, из базы).
$test_variables = array(
    'user' => '<<<<<Kolyan>>>>>',
    'message' => 'привет',
    'html_announcement' => 'это <u>HTML</u>, который не будет экранирован'
);

// Некий шаблон (например, из файла).
$test_template = <<< 'TEMPLATE_END'
<div id="announcement">%html_announcement%</div>
<div class="record">
    <div class="user">%user%</div>
    <div class="message">%message%</div>
</div>
TEMPLATE_END;

// Нас не интересуют детали HTML, мы поручаем все шаблонизатору.
echo render_template($test_template, $test_variables);
?>
