我正在构建一个简单的模板引擎(在PHP中),我的循环代码需要正则表达式,循环看起来像这样:
{loop var=menu[0]}
<li><a href="{link}">{text}</a></li>
{/loop}
其中“menu [0]”可以是带或不带下划线,数字和方括号的任何大写或小写字母的字符串([])
the '{loop var=', '}' and '{/loop}' always stay the same
我将使用php的preg_match进行比较。
我的正则表达式到目前为止(可能非常关闭)是:
/[{loop var=][\w\s_0-9\[\]][}]/
我的php是这样的:
function loop($template) {
preg_match($pattern, $template, $matches);
foreach ($matches as $key => $match) {
...
$var = str_replace(array('{loop var=', '}'), '', $match));
$data = $this->get($var);
...
$loop_code = str_replace('{' . $var . '}', $data, $loop_code);
...
}
}
输入是我上面的模板,所需的输出低于
<ul>
<li><a href="<?php print $menu[0][0]['link']; ?>"><?php print $menu[0][0]['text']; ?></a></li>
<li><a href="<?php print $menu[0][1]['link']; ?>"><?php print $menu[0][1]['text']; ?></a></li>
</ul>
要做到这一点,我需要preg_match来匹配任何这些字符串(在他们的整体中)
{loop var=menu[0]}
{loop var=menu_main}
{loop var=__menu}
{loop var=MenuMain}
感谢您的任何意见。
答案 0 :(得分:0)
我不确定这是否正是您所追求的,但以下正则表达式将与您在=之后和结束之前提供的4个示例中的任何一个匹配}
$replacement = '/(menu\[\d]|(m|M)enu(_)?(m|M)ain|__menu))/';
我只是不太确定你想如何使用它以及你将要用它替换它。
如果您还想捕获{loop var = xxxxx},您需要这样:
$replacement = '//({loop var=(menu\[\d]|(m|M)enu(_)?(m|M)ain|__menu)})/';
答案 1 :(得分:0)
您滥用方括号,仅表示single character。尝试使用http://regex101.com/等资源来测试。
使用preg_match()
的全部力量,而不是与str_replace
混淆以后清理事物,而不是{{3}}:
$template = "{loop var=menu[0]}\n<li><a href=\"{link}\">{text}</a></li>\n{/loop}";
$pattern = "/\{loop var=([\w\[\]]+)\}(.*?)\{\/loop\}/ism";
preg_match($pattern, $template, $matches);
$var_name = $matches[1];
$template_code = $matches[2];