因为php5.5版本废弃了preg_replace的/e模式,建议替换preg_replace_callback函数。但是问题来了,对于下段代码不知该怎么写了,这是个模板类变量替换的代码。
/*转意对正则表达式有影响的字符,例如:转义\*/ $left=preg_quote($this->delimiter_left); $right=preg_quote($this->delimiter_right); $pattern=array( /*1.替换模板中的变量*/ '/'.$left.'\s*\$([a-za-z0-9_]*)\s*'.$right.'/i', /*2.匹配模板中的if*/ '/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/is' ); $replacement=array( /*1.替换模板中的普通变量*/ 'tpl_vars[${1}];?>', /*2.替换模板中的if字符串*/ '这是if字段', ); /*开始替换模板文件中的标签*/ $this->template_html=preg_replace($pattern,$replacement,$this->template_html); return $this->template_html;
回复讨论(解决方案) 你没有使用 e模式,所以不需要改写
你没有使用 e模式,所以不需要改写
不是的,这段代码中本来是要用到/e模式的,你看那个要替换的数组中存入的值是php代码,本来在/e模式下这段代码是没问题的,结果php5.5以后的版本要废弃/e模式,用preg_replace_callback怎么弄都不对,关键里面有个${1}反向引用,怎么写都报错。
$pattern=array(
/*1.替换模板中的变量*/
'/'.$left.'\s*\$([a-za-z0-9_]*)\s*'.$right.'/i',
/*2.匹配模板中的if*/
'/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/is'
);
那条使用了 e 模式?
你应该给出原始的代码,而不是你修改过的代码!
$pattern=array(
/*1.替换模板中的变量*/
'/'.$left.'\s*\$([a-za-z0-9_]*)\s*'.$right.'/i',
/*2.匹配模板中的if*/
'/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/is'
);
那条使用了 e 模式?
你应该给出原始的代码,而不是你修改过的代码!
/*转意对正则表达式有影响的字符,例如:转义\*/$left=preg_quote($this->delimiter_left);$right=preg_quote($this->delimiter_right);$pattern=array( /*1.替换模板中的变量*/ '/'.$left.'\s*\$([a-za-z0-9_]*)\s*'.$right.'/i', /*2.匹配模板中的if*/ '/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/ies');$replacement=array( /*1.替换模板中的普通变量*/ 'tpl_vars[${1}];?>', /*2.替换模板中的if字符串*/ '这是if字段',);/*开始替换模板文件中的标签*/$this->template_html=preg_replace($pattern,$replacement,$this->template_html);return $this->template_html;
大概是第八行。我已经用preg_replace_callback('参数一',function($matches){},'参数3')的方式成功进行了普通变量的替换。但当把参数2的回调函数写在外面,作为类的方法时,调用就错误,是我不会用吧。
public function tpl_replace(){ /*转意对正则表达式有影响的字符,例如:转义\*/ $left=preg_quote($this->delimiter_left); $right=preg_quote($this->delimiter_right); $pattern=array( /*1.替换模板中的变量*/ '/'.$left.'\s*\$([a-za-z0-9_]*)\s*'.$right.'/i', /*2.匹配模板中的if*/ '/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/is' ); $replacement=array( /*1.替换模板中的普通变量*/ 'tpl_vars[${1}];?>', /*2.替换模板中的if字符串*/ '这是if字段', ); /*开始替换模板文件中的标签*/ //$this->template_html=preg_replace($pattern,$replacement,$this->template_html); $this->template_html=preg_replace_callback($pattern,function($matches){ /*1.替换模板中的普通变量*/ $replacement=$this->tpl_vars[$matches[1]]; return $replacement; },$this->template_html); return $this->template_html; }
与之前不同的是php是写在函数内,之前/e模式php代码是写在字符串内,这是本质区别吧。似乎感觉麻烦了许多。
当把回调函数写在外面,作为类的方法时,调用就出现错误,是我还没摸到门路。
public function callback($matches){ $replacement=$this->tpl_vars[$matches[1]]; return $replacement; }
$pattern=array(
/*1.替换模板中的变量*/
'/'.$left.'\s*\$([a-za-z0-9_]*)\s*'.$right.'/i',
/*2.匹配模板中的if*/
'/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/ies'
);
那条使用了 e 模式?
你应该给出原始的代码,而不是你修改过的代码!
/*转意对正则表达式有影响的字符,例如:转义\*/$left=preg_quote($this->delimiter_left);$right=preg_quote($this->delimiter_right);$pattern=array( /*1.替换模板中的变量*/ '/'.$left.'\s*\$([a-za-z0-9_]*)\s*'.$right.'/i', /*2.匹配模板中的if*/ '/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/is');$replacement=array( /*1.替换模板中的普通变量*/ 'tpl_vars[${1}];?>', /*2.替换模板中的if字符串*/ '$this->stripvtags(\'\',\'${2}\')',);/*开始替换模板文件中的标签*/$this->template_html=preg_replace($pattern,$replacement,$this->template_html);return $this->template_html;
前面一段代码贴错了,这个应该接近原代码。其实原码是《细说php》中简易模板类中的一段代码,我是想照着仿写个用于自己程序的模板类。
/*转意对正则表达式有影响的字符,例如:转义\*/$left=preg_quote($this->delimiter_left);$right=preg_quote($this->delimiter_right);$pattern=array( /*1.替换模板中的变量*/ '/'.$left.'\s*\$([a-za-z0-9_]*)\s*'.$right.'/i', /*2.匹配模板中的if*/ '/'.$left.'\s*if\s*(.+?)\s*'.$right.'(.+?)'.$left.'\s*\/if\s*'.$right.'/ies');$replacement=array( /*1.替换模板中的普通变量*/ 'tpl_vars[${1}];?>', /*2.替换模板中的if字符串*/ '$this->stripvtags(\'\',\'${2}\')',);/*开始替换模板文件中的标签*/$this->template_html=preg_replace($pattern,$replacement,$this->template_html);return $this->template_html;
修正一下,论坛修改不了内容真麻烦。