• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-23) 19次浏览 已收录 0个评论
文章目录[隐藏]

因为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;

回复讨论(解决方案)

你没有使用 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.替换模板中的普通变量*/    '<?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;	}

$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($pa<em style="color:transparent">本文来源[email protected]搞@^&代*@码)网9</em><strong>搞代gaodaima码</strong>ttern,$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.替换模板中的普通变量*/    '<?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;

修正一下,论坛修改不了内容真麻烦。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:这段代码preg_replace函数替换成preg_replace_callback函数该怎么写?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址