嘿我正在尝试制作模板引擎,但是遇到了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
答案 0 :(得分:0)
为了描述内部括号和最终嵌套括号之间的内容,模式是(“if”模式的示例):
~@if\(([^()]*+(?:\((?-1)\)[^()]*)*+)\)~
(?-1)
代表上次打开的捕获组中的子模式。由于它位于捕获组本身,因此您将获得递归。 (请注意,您也可以使用(?1)
的捕获组编号调用子模式,而不是像示例中那样以相对方式调用子模式,但是当模式包含多个捕获组时,相对方式更有用。)
当字符串格式不正确时,该模式使用所有格量词*+
(禁止回溯)更快失败。