【问题标题】:Template ifs using regex使用正则表达式的模板 ifs
【发布时间】:2008-12-23 20:39:59
【问题描述】:

大家好,我正在开发一个 PHP 应用程序,它需要解析一个包含 HTML 的 .tpl 文件,我正在制作它,以便 HTML 可以包含变量和基本的 if 语句。 if 语句看起来像这样: `

<!--if({VERSION} == 2)-->
Hello World
<!--endif -->

为了解析它,我尝试使用preg_replace,但没有成功。我尝试的模式是

/<!--if\(([^\]*)\)-->([^<]*)<!--endif-->/e

替换为

if($1) { echo "$2"; }

关于为什么这不起作用以及我可以做些什么来让它运行起来的任何想法?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    endif--&gt; 之间有一个空格,但您的正则表达式不允许这样做。

    顺便说一句,这似乎非常不安全......你有什么理由不使用像 Smarty 这样的预构建模板引擎?

    【讨论】:

      【解决方案2】:

      测试您的正则表达式,我看到您的反斜杠应用于方括号。要在带引号的字符串内的方括号内使用反斜杠,您需要将其转义两次:

      '/<!--if\(([^\\\]*)\)-->([^<]*)<!--endif-->/e'
      

      但我不知道你为什么要发明一个新的模板逻辑框架,当 Smarty 和 PHP 本身这样的解决方案存在时。


      这里是测试代码,响应下面的cmets。

      testinput.tpl

      <!--if({VERSION} == 2)-->
      Hello World
      <!--endif-->
      

      ma​​tch.php

      <?php
      $template = file_get_contents('testinput.tpl');
      print preg_match('/<!--if\(([^\\\]*)\)-->/e', $template) . "\n";
      print preg_match('/<!--endif-->/e', $template) . "\n";
      print preg_match('/<!--if\(([^\\\]*)\)-->([^<]*)<!--endif-->/e', $template) . "\n";
      

      试运行

      $ php match.php
      1
      1
      1
      

      【讨论】:

      • 我正要问完全相同的问题......所以我只是赞成你的! ;-)
      • 三个反斜杠和一个反斜杠一样糟糕,Bill;你还在逃避方括号。
      • 真的吗?我刚刚运行它,它返回与输入的正匹配。而使用一个或两个反斜杠会给出关于不平衡方括号的错误。
      • 嗯。使用四个反斜杠,它也返回一个正匹配。
      • 你如何测试它,捕获组包含什么?我在 EditPad 的搜索框中试了一下,没有任何错误,但什么都不匹配。 Java 甚至不会接受带有奇数个反斜杠的它。
      【解决方案3】:

      我认为你的本意是:

      '/<!--if\(([^)]*)\)-->([^<]*)<!--endif-->/'
      

      你的正则表达式只有一个字符类:

      [^\]*)\)-->([^<]
      

      这是发生了什么:

      • 第一个右方括号被反斜杠转义,所以它是按字面意思匹配的。
      • 应该关闭第一个捕获组并打开第二个捕获组的括号也按字面意思使用;不必在字符类中转义括号。
      • 第一个连字符视为元字符;它形成范围 [)*+,-]
      • 第二个左方括号被视为文字方括号,因为它位于字符类中。
      • 第二个插入符号被视为文字插入符号,因为它不是类中的第一个字符。

      因此,在删除重复项并将字符排序为它们的 ASCII 顺序之后,您的字符类相当于:

      [^()*+,\-<>\[\]^]
      

      并且字符类之外的括号仍然是平衡的,因此正则表达式可以编译,但它甚至无法与您想要的匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-22
        相关资源
        最近更新 更多