PHP正则表达式帮助/解释

时间:2011-11-03 13:56:11

标签: php regex

到目前为止,除了检查电子邮件地址是否有效外,我已成功避免使用正则表达式。然而,作为一个更大的大学项目的一部分,我正在开发一个简单的诱人引擎,并试图实现我自己的简单语法来处理循环,并最终实现IF语句,而不是在我的模板文件中包含PHP。我知道很多人会说不要打扰或只是使用现有的系统,但正如我的论文所述,我希望尽可能多地成为我自己的工作!

无论如何,回到问题。我在我的模板文件中有以下代码作为示例:

<p>Template Header</p>
{{foreach{array1}}}
    <p>This is the first content line that should be displayed.</p>
{{/foreach}}
{{foreach{array2}}}
    <p>This is the second content line that should be displayed.</p>
{{/foreach}}
<p>Template Footer</p>

然后我得到了以下PHP来读取文件,寻找循环并提取它们。

<?php
$template = file_get_contents('reg.html');
$expression = "#.*{{foreach{(.*?)}}}(.*?){{/foreach}}.*#is";
$result = preg_replace($expression, "$1", $template);  
var_dump($result);
?>

当调用preg_replace并转储结果时,$ 1给出了将用于循环(array1或array2)的数组名称,然后将其更改为$ 2将为我提供循环标记之间的内容。完善。问题是它只适用于一个{{foreach}}标记。

反正我是否可以循环正则表达式的所有匹配以获得我上面的结果?非常感谢ANy的帮助/建议 - 但是对我而言,简单的正则表达式对我来说是新鲜的!

1 个答案:

答案 0 :(得分:1)

$expression = "#.*{{foreach{(.*?)}}}(.*?){{/foreach}}.*#is";
                ^^                                   ^^

您不仅要匹配“foreach”模板标记,还要匹配它之前和之后的所有内容。这意味着第二个foreach也将被.*吃掉。所以你再也无法匹敌了。