0

我们有一种情况,我们有一个模板文件,如下所示

<?php
  $tpl = '
    <p>This is the header</p>
    {if "IS VALID"}
      <p>The value is valid
      {if "IS NUMBER"}
        and it is a number
      {/if}
      </p>
    {/if}
 ';

  $is_valid = false;
  $is_number = true;

  if ($is_valid){
    $tpl = preg_replace('/\{if "IS VALID"\}(.*)\{\/if\}/sU','\1',$tpl);
  }else{
    $tpl = preg_replace('/\{if "IS VALID"\}(.*)\{\/if\}/sU','',$tpl);
  }

  if ($is_number){
    $tpl = preg_replace('/\{if "IS NUMBER"\}(.*)\{\/if\}/sU','\1',$tpl);
  }else{
    $tpl = preg_replace('/\{if "IS NUMBER"\}(.*)\{\/if\}/sU','',$tpl);
  }

  echo $tpl;
?>

问题是第一个替换,一直替换到 FIRST {/if} 块。我们希望它替换匹配的{/if},即考虑到{if} 的嵌套。

实现这一目标的最有效方法是什么?

先感谢您!

4

1 回答 1

1

先把这个说法

if ($is_number){
    $tpl = preg_replace('/\{if "IS NUMBER"\}(.*)\{\/if\}/sU','\1',$tpl);
  }else{
    $tpl = preg_replace('/\{if "IS NUMBER"\}(.*)\{\/if\}/sU','',$tpl);
  }

您必须先检查最深的级别,以免被其他人覆盖

编辑:

如果您删除“U”选项,您的正则表达式将采用最新的关闭{/if}:

$tpl = preg_replace('/\{if "IS VALID"\}(.*)\{\/if\}/s','\1',$tpl);

$tp1 将包含:

{if "IS VALID"}
<p>The value is valid
{if "IS NUMBER"}
and it is a number
{/if}
</p>

女巫应该算出你其他人的陈述

于 2013-05-23T08:05:07.930 回答