Я пытаюсь сделать простые пользовательские теги, чтобы разрешить настраиваемые шаблоны в моем приложении. Но я не могу понять, как анализировать и заменять теги.
(пример)
<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, который возвращается из функции.
Вы можете использовать регулярные выражения в соответствии с вашими пользовательскими тегами.
$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 aproach, свяжитесь со мной, и я покажу вам, как это сделать.
http://us3.php.net/manual/en/function.preg-replace-callback.php
Мой партнер выполнил работу с разбором тегов … в зависимости от сложности, которую вы хотите достичь, вы можете использовать регулярное выражение. Используйте регулярное выражение для поиска тегов, а затем вы можете разделить строки дальше с функциями манипуляции строками по своему усмотрению. Функция обратного вызова на preg_replace_callback позволит вам заменить тег на любые html-данные, которые вы хотите представить. Ура!
edit: (<module +? ([^ =] +? = "[^"] *? " ?) ?? />) Это должно соответствовать функциям модуля … удалить пространство между <и модулем (SO – синтаксический анализ это неправильно). В вашей пользовательской функции соответствуют индивидуальные параметры, содержащиеся в теге, с использованием регулярного выражения типа: ([^ =] +? = "[^"] ? ")
Вы можете проанализировать свой файл с помощью simplexml и получить атрибуты после итерации и поиска ваших элементов. Вот пример.
Как предположил preg_replace_callback
подходит для решения такого типа.
Другой вариант – прочитать шаблон / файл в формате XML, если вы ожидаете проверки разметки xml, с помощью XmlReader
и действовать на соответствующих узлах. В качестве дополнительного предложения вы можете использовать Xml Namespaces для своих пользовательских тегов, поскольку это гарантирует, что у вас нет коллизий.
Я написал фактический класс php для этого и выпущен под BSD. Посмотреть эту другую тему