php替换模板引擎中的文本

时间:2013-05-23 07:58:20

标签: php regex templates tags nested

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

<?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} s的嵌套。

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

提前谢谢!

1 个答案:

答案 0 :(得分: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>

女巫要数学你的其他人的身份