正则表达式php,匹配字符串与变量文本(字母,数字,下划线,[])

时间:2016-10-25 18:05:27

标签: php regex

我正在构建一个简单的模板引擎(在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}

感谢您的任何意见。

2 个答案:

答案 0 :(得分:0)

我不确定这是否正是您所追求的,但以下正则表达式将与您在=之后和结束之前提供的4个示例中的任何一个匹配}

$replacement = '/(menu\[\d]|(m|M)enu(_)?(m|M)ain|__menu))/';

我只是不太确定你想如何使用它以及你将要用它替换它。

enter image description here

如果您还想捕获{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];