private function process($text){
$reg = "/\{([0-9a-zA-Z\- ]+)\:([0-9a-zA-Z\- ]+):?\}/";
return preg_replace_callback($reg, array($this, 'replace'), $text);
}
private function replace($matches){
if (method_exists($this, $matches[1])){
return @$this->$matches[1]($matches[2]);
}
}
}
?>
对于 PHP5.3,第二个参数像这样 "self::replace" :
注意,也可以是 array($this, 'replace')。
复制代码 代码如下:
<?php
class test_preg_callback{
private function process($text){
$reg = "/\{([0-9a-zA-Z\- ]+)\:([0-9a-zA-Z\- ]+):?\}/";
return preg_replace_callback($reg, "self::replace", $text);
}
private function replace($matches){
if (method_exists($this, $matches[1])){
return @$this->$matches[1]($matches[2]);
}
}
}
?>
根据上面所学到的知识点,把模板引擎类改造如下:
复制代码 代码如下:
<?php
/**
* 模板解析类
*/
class Template {
public function compile($template) {
// if逻辑
$template = preg_replace_callback("/\<\!\-\-\{if\s+(.+?)\}\-\-\>/", array($this, 'ifTag'), $template);
return $template;
}
/**
* if 标签
*/
protected function ifTag($matches) {
return '<?php if (' . $matches[1] . ') { ?>';
}
}
$template = 'xxx<!--{if $user[\'userName\']}-->yyy<!--{if $user["password"]}-->zzz';
$tplComplier = new Template();
$template = $tplComplier->compile($template);
echo $template;
?>
输出结果为:
复制代码 代码如下:
xxx<?php if ($user['userName']) { ?>yyy<?php if ($user["password"]) { ?>zzz
正是我们想要的结果,双引号没有被反转义!
PS:关于正则,本站还提供了2款非常简便实用的正则表达式工具供大家使用:
JavaScript正则表达式在线测试工具:
您可能感兴趣的文章: