使用PHP解析自定义标记

时间:2009-07-29 17:15:24

标签: php xml parsing

我正在尝试制作简单的自定义标记,以允许我的应用上的自定义模板。但我无法弄清楚如何解析和替换标签。

(实施例)

<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 个答案:

答案 0 :(得分: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方法,请与我联系,我会告诉你如何做到这一点。

答案 1 :(得分:3)

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

我的合作伙伴已完成标记解析...根据您希望实现的复杂性,您可能希望使用正则表达式。使用正则表达式查找标签,然后您可以使用您自己喜欢的字符串操作函数进一步拆分字符串。 preg_replace_callback上的回调功能将允许您将标记替换为您希望它表示的任何html数据。干杯!

编辑: (&lt; module +?([^ =] +?=“[^”] *?“?)?/&gt;) 这应该匹配模块函数...删除&lt;和模块(SO正在解析它错误)。在自定义函数中,使用正则表达式匹配标记中包含的各个参数: ([^ =] + = “[^”] ?“)

答案 2 :(得分:3)

您可以使用simplexml解析文件,并在迭代并查找元素后检索属性。这是example.

答案 3 :(得分:2)

由于Natso建议preg_replace_callback对于此类解决方案非常有用。

另一种选择是以XML格式读取模板/文件,如果您希望使用XmlReader验证xml标记并在相应的节点上执行操作。作为进一步的建议,您可能希望将Xml Namespaces用于自定义标记,因为这样可以确保您不会发生冲突。

答案 4 :(得分:1)

我为此编写了一个实际的php类,并在BSD下发布。 See this other thread