Метод замены тегов PHP - PullRequest
       23

Метод замены тегов PHP

2 голосов
/ 01 марта 2012

Я храню макеты HTML в базе данных MySQL.Эти макеты могут содержать теги в HTML, как показано ниже ..

{site.poll="fred,joe,john"}

и

{site.layout.header}

В настоящее время я ищу шаблон HTML, выполняя несколько preg_matches для идентификации тегов, просматриваязатем массив, выполняющий str_replace (), заменив его другим частичным html-шаблоном, также извлеченным из базы данных. Пример ниже.выполнить str_replace для каждого экземпляра этого тега .. То же самое снова нужно будет сделать для каждого необходимого частичного шаблона. Мне кажется, все это становится тяжелым.

Есть ли лучший способ сделать это?

Заранее спасибо ..

Редактировать: Я не хочу использовать существующую библиотеку, я хотел бы выполнить эту задачу сам и учиться в процессе ..

Ответы [ 2 ]

5 голосов
/ 01 марта 2012

Ну, вы можете использовать preg_replace, чтобы найти и заменить ваши метки за один снимок.

На мой взгляд, лучший подход - это использовать существующую систему шаблонов, такую ​​как Twig или Smarty.Я точно знаю, что вы можете читать данные в Smarty (это не обязательно из файла).Я уверен, что у Твига есть нечто подобное.

Twig и Smarty также предоставляют опции кэширования, поэтому вы не перестраиваете свой шаблон при каждом запросе.Однако они лучше всего работают, если шаблоны хранятся в файлах.

Если вам действительно нужно развернуть свою собственную систему шаблонов, вы должны создать какой-то синтаксический анализатор, который фактически проверяет содержимое символ за символом.Скорее всего, это будет быстрее и точнее, чем регулярные выражения (хотя и сложнее)

2 голосов
/ 12 марта 2012

Я не ожидаю, что это ответит на ваш вопрос как таковой, но подумал, что это может дать вам еще кое-что, чтобы подумать.Некоторый код, который у меня есть, когда мой шаблонный класс перегружен.

function replace_tags(&$xhtml, $tags) {
    if( is_array($tags) && count($tags) > 0 )
        foreach ($tags as $tag => $data) {
            $xhtml = str_replace("{{" . $tag . "}}", $data, $xhtml);
        }

    if( $xhtml ) return $xhtml;
}

$tpl = "/templates/index.xhtml";
$tags = array(
    "css"             => null,
    "js"              => null,
    "main_content"    => null
);

$tags['main_content'] = file_get_contents("/home/main.xhtml");

echo replace_tags(file_get_contents($tpl), $tags);

редактироватьЯ хотел бы уточнить причину, по которой функция получает $ xhtml по ссылке, а также возвращает $ xhtml.В основном, просто чтобы сделать это двойным назначением.

//Usage at the end of a page
echo replace_tags(file_get_contents($tpl), $tags);

//Usage for template in template
$tags['menu'] = file_get_contents($menu_tpl);
replace_tags($tags['menu'], $tags);

echo replace_tags(file_get_contents($tpl), $tags);
...