我正在尝试制作简单的自定义标记,以允许我的应用上的自定义模板。但我无法弄清楚如何解析和替换标签。
(实施例)
<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块替换模块标记。
答案 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)
答案 3 :(得分:2)
由于Natso建议preg_replace_callback
对于此类解决方案非常有用。
另一种选择是以XML格式读取模板/文件,如果您希望使用XmlReader
验证xml标记并在相应的节点上执行操作。作为进一步的建议,您可能希望将Xml Namespaces用于自定义标记,因为这样可以确保您不会发生冲突。
答案 4 :(得分:1)
我为此编写了一个实际的php类,并在BSD下发布。 See this other thread