这段代码preg_replace函数替换成preg_replace_callback函数该怎么写?

爆米花吉他 2015-10-19 08:29:34
因为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.替换模板中的普通变量*/
'<?php echo $this->tpl_Vars["${1}"];?>',
/*2.替换模板中的if字符串*/
'这是IF字段',
);
/*开始替换模板文件中的标签*/
$this->Template_HTML=preg_replace($pattern,$replacement,$this->Template_HTML);
return $this->Template_HTML;
...全文
111 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2015-10-20
  • 打赏
  • 举报
回复
$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 模式? 你应该给出原始的代码,而不是你修改过的代码!
爆米花吉他 2015-10-20
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
你没有使用 e模式,所以不需要改写
不是的,这段代码中本来是要用到/e模式的,你看那个要替换的数组中存入的值是PHP代码,本来在/e模式下这段代码是没问题的,结果PHP5.5以后的版本要废弃/e模式,用preg_replace_callback怎么弄都不对,关键里面有个${1}反向引用,怎么写都报错。
xuzuning 2015-10-20
  • 打赏
  • 举报
回复
你没有使用 e模式,所以不需要改写
爆米花吉他 2015-10-20
  • 打赏
  • 举报
回复

/*转意对正则表达式有影响的字符,例如:<{}>转义\<\{\}\>*/
$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.替换模板中的普通变量*/
    '<?php echo $this->tpl_Vars["${1}"];?>',
    /*2.替换模板中的if字符串*/
    '$this->stripvtags(\'<?php if(${1}) { ?>\',\'${2}<?php } ?>\')',
);
/*开始替换模板文件中的标签*/
$this->Template_HTML=preg_replace($pattern,$replacement,$this->Template_HTML);
return $this->Template_HTML;
修正一下,论坛修改不了内容真麻烦。
爆米花吉他 2015-10-20
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
$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.替换模板中的普通变量*/
    '<?php echo $this->tpl_Vars["${1}"];?>',
    /*2.替换模板中的if字符串*/
    '$this->stripvtags(\'<?php if(${1}) { ?>\',\'${2}<?php } ?>\')',
);
/*开始替换模板文件中的标签*/
$this->Template_HTML=preg_replace($pattern,$replacement,$this->Template_HTML);
return $this->Template_HTML;
前面一段代码贴错了,这个应该接近原代码。其实原码是《细说PHP》中简易模板类中的一段代码,我是想照着仿写个用于自己程序的模板类。
爆米花吉他 2015-10-20
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
$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.替换模板中的普通变量*/
    '<?php echo $this->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.替换模板中的普通变量*/
			'<?php echo $this->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;
	}

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧