2009-07-29 2 views
6

Я пытаюсь сделать простые пользовательские теги, чтобы разрешить настраиваемые шаблоны в моем приложении. Но я не могу понять, как анализировать и заменять теги.Разбор пользовательских тегов с 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, который возвращается из функции.

ответ

9

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

$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

Серьезно? Зачем использовать регулярное выражение, когда оно намного медленнее, чем встроенные функции XML. – icco

+2

Это не медленнее. –

3

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

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

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

3

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

+0

Если вы написали код, чтобы точно объяснить, как это сделать, этот ответ может быть принят. – icco

2

Предлагаемый Natsopreg_replace_callback отлично подходит для такого решения.

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

Смежные вопросы