我认为解决这个问题的最好方法是在几个不同的步骤中做到这一点。
首先,您应该使用preg_replace_callback和/(?>{([^}]+)})(.*)?{\/\1}/sim
作为正则表达式。这会找到顶级{tag} {/ tag}。 $匹配[2]将包含内容(不带标签),而$匹配1将包含标签本身。
您应该创建一个递归调用的函数,以便在回调中再次调用$ matches [2],以便找到子项{tags},以防万一。这就是你将如何穿过树。
最后,您应该创建一个处理{%tag%}的第三个函数。我会再次使用preg_replace_callback并使用switch语句来处理标记名称。
这应该指向正确的方向。
编辑:这是一个什么样上述我一个全功能的演示: \
<?php
$content = <<<END
{a}
{b}I like {%first%} {%last%} a {c}lot{/c}.{/b}
{/a}
END;
echo find_tags($content);
function find_tags($content)
{
return preg_replace_callback('/(?>{([^}]+)})(.*)?{\/\1}/sim', 'find_tags_callback', $content);
}
function find_tags_callback($matches)
{
// Find and process any children tag pairs.
$matches[2] = find_tags($matches[2]);
// Process the tags {%tag%}.
$matches[2] = preg_replace_callback('/{%([^%]+)%}/sim', 'process_tags', $matches[2]);
switch ($matches[1])
{
case 'a':
$tag = 'div';
break;
case 'b':
$tag = 'p';
break;
case 'c':
$tag = 'b';
break;
}
return '<'.$tag.'>'.$matches[2].'</'.$tag.'>';
}
function process_tags($matches)
{
switch ($matches[1])
{
case 'first':
return 'Francois';
break;
case 'last':
return 'Deschenes';
break;
}
}
//
结果字符串为:<div><p>I like Francois Deschenes a <b>lot</b>.</p></div>
。
谢谢老兄,解决了我的问题 – Omid 2011-06-14 07:50:04
不客气! – 2011-06-14 18:06:43