Разбор пользовательских тегов с помощью PHP - PullRequest
6 голосов
/ 29 июля 2009

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

(пример)

<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-фрагмент, возвращаемый функцией.

Ответы [ 5 ]

9 голосов
/ 29 июля 2009

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

$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-подход, свяжитесь со мной, и я покажу вам, как это сделать.

3 голосов
/ 29 июля 2009

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

3 голосов
/ 29 июля 2009

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

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

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

2 голосов
/ 29 июля 2009

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

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

1 голос
/ 08 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...