我使用此模式'/(\{(\w+)\}(.*))?\{%(\w+)%\}((.*)\{\/(\w+)\})?/i'
使用preg_match
函数从模板中提取标记。
示例模板:
<table id="middle" cellspacing="0px" cellpadding="0px">
{middle}
<tr>
{left}<td>{%left%}</td>{/left}
<td>{%middle%}{%content%}</td>
{right}<td>{%right%}</td>{/right}
</tr>
{/middle}
</table>
如何确保每个代码的start
和end
与其名称相匹配
在此示例中,middle
标记与middle
和content
匹配,但它应与middle
标记匹配
答案 0 :(得分:1)
我认为解决这个问题的最佳方法是在几个不同的步骤中完成。
首先,您应该使用preg_replace_callback /(?>{([^}]+)})(.*)?{\/\1}/sim
作为正则表达式。这将找到顶级{tag} {/ tag}。 $ matches [2]将包含内容(不包含标签),而$ matches 1将包含标签本身。
你应该创建一个递归调用的函数,这样在回调中,它会在$ matches [2]上再次调用,所以找到子{tag}以防万一。这就是你将如何通过树。
最后,您应该创建一个处理{%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>
。
答案 1 :(得分:0)
1我有信心但不确定,为了确保封闭标签({this} {/ this})与数据标签匹配({%this%}),您需要一个附带的if语句来测试返回字符串。
我会使用preg_replace_callback函数,如下所示:
<?php
$str = '<template contents>';
$newstr = preg_replace_callback(
'/(\{(\w+)\}(.*))?\{%(\w+)%\}((.*)\{\/(\w+)\})?/i',
'check', //<-- the function to send matches to
$str);
function check($matches){
if($matches[1] == $matches[2] && $matches[1] == $matches[3]){
/*Do Work*/
return ''; //new formatted string to send back to the $newstr var
}
}
?>
preg_replace_callback函数将作为数组找到的所有匹配项发送到指定的函数进行处理,然后从该函数返回新格式化的字符串。