Разбор пользовательских тегов с помощью PHP

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

(пример)

<div class="blog">
<module display="posts" limit="10" show="excerpt" />
</div>
<div class="sidebar">
<module display="users" limit="5" />
<module display="comment" limit="10" />
</div>

для каждого найденного тега модуля я хочу запустить функцию создания модуля с параметрами (перечисленными в теге как атрибуты). И замените тег модуля фактическим фрагментом HTML, который возвращается функцией.


person g00se0ne    schedule 29.07.2009    source источник


Ответы (5)


Вы можете использовать регулярные выражения для соответствия вашим пользовательским тегам.

$html // Your html

preg_match_all('/<module\s*([^>]*)\s*\/?>/', $html, $customTags, PREG_SET_ORDER);

foreach ($customTags as $customTag) {
 $originalTag=$customTag[0];
 $rawAttributes=$customTag[1];

 preg_match_all('/([^=\s]+)="([^"]+)"/', $rawAttributes, $attributes, PREG_SET_ORDER);

 $formatedAttributes=array();

 foreach ($attributes as $attribute) {
  $name=$attribute[1];
  $value=$attribute[2];

  $formatedAttributes[$name]=$value;
 }

 $html=str_replace($originalTag, yourFunction($formatedAttributes), $html);
}

Если вы хотите использовать подход XML, свяжитесь со мной, и я покажу вам, как это сделать.

person Cristian Toma    schedule 29.07.2009
comment
Шутки в сторону? Зачем использовать регулярное выражение, если оно намного медленнее, чем встроенные функции XML. - person icco; 30.07.2009

http://us3.php.net/manual/en/function.preg-replace-callback.php

Мой партнер проделал работу с разбором тегов... в зависимости от сложности, которую вы хотите достичь, вы можете использовать регулярное выражение. Используйте регулярное выражение для поиска тегов, а затем вы можете разделить строки дальше с помощью функций манипулирования строками по своему усмотрению. Функция обратного вызова в preg_replace_callback позволит вам заменить тег любыми html-данными, которые вы хотите, чтобы он представлял. Ваше здоровье!

edit: ( ‹ module +?([^=]+?="[^"]*?" ?)? ?/>) Это должно соответствовать функциям модуля... удалить пробел между ‹ и модулем (SO неправильно анализирует его). В своей пользовательской функции сопоставьте отдельные параметры, содержащиеся в теге, используя регулярное выражение, например: ([^=]+?="[^"] ?")

person Zachery Delafosse    schedule 29.07.2009

Вы можете проанализировать свой файл с помощью simplexml и получить атрибуты после повторения через и найти свои элементы. Вот пример.

person Sterling Hirsh    schedule 29.07.2009
comment
Если бы вы написали код, объясняющий, как именно это сделать, этот ответ мог бы быть принят. - person icco; 30.07.2009

Как предложил Natso preg_replace_callback отлично подходит для решения такого типа.

Другим вариантом может быть чтение шаблона/файла в виде XML, если вы ожидаете проверки XML-разметки, с XmlReader и воздействовать на соответствующие узлы. В качестве еще одного предложения вы можете использовать Xml Namespaces для своих пользовательских теги, так как это гарантирует, что у вас не будет столкновений.

person Jordan S. Jones    schedule 29.07.2009

Я написал для этого реальный класс php и выпущен под BSD. см. этот другой поток

person buggedcom    schedule 08.09.2010