如何解决如何使用preg_match提取自定义标签
| 我使用pattern0ѭ模式使用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
标签匹配
解决方法
我认为解决此问题的最佳方法是分几个步骤进行。
首先,应将preg_replace_callback和
/(?>{([^}]+)})(.*)?{\\/\\1}/sim
用作正则表达式。这将找到最高级别的{tag} {/ tag}。 $ matches [2]将包含内容(不带标签),而$ matches1将包含标签本身。
您应该创建一个递归调用的函数,以便在回调中再次在$ 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>
。
, 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函数会将找到的所有匹配项作为数组发送到指定函数进行处理,然后从该函数返回新的格式化字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。