php模板引擎,preg_replace

时间:2015-12-05 17:35:10

标签: php preg-replace pcre

嘿我正在尝试制作模板引擎,但是遇到了if语句的问题

$this->template = preg_replace('~@if\((.*?)\)~', '?php if($1): ?', $this->template);
    $this->template = preg_replace('~@elseif\((.*?)\)~', '<?php elseif($1): ?>', $this->template);
    $this->template = preg_replace('~@else~', '<?php else: ?>', $this->template);
    $this->template = preg_replace('~@endif~', '?php endif; ?', $this->template);

如果我尝试用字符串中的其他括号替换字符串,preg_replace取第一个,而不是右边

例如

@if(!isset($active)) Show @endif

变为

<?php if(!isset($active): ?>) Show @endif

1 个答案:

答案 0 :(得分:0)

为了描述内部括号和最终嵌套括号之间的内容,模式是(“if”模式的示例):

~@if\(([^()]*+(?:\((?-1)\)[^()]*)*+)\)~

(?-1)代表上次打开的捕获组中的子模式。由于它位于捕获组本身,因此您将获得递归。 (请注意,您也可以使用(?1)的捕获组编号调用子模式,而不是像示例中那样以相对方式调用子模式,但是当模式包含多个捕获组时,相对方式更有用。)

当字符串格式不正确时,该模式使用所有格量词*+(禁止回溯)更快失败。