PHP7.4.16下preg_replace的e修饰符废弃,求替换为preg_replace_callback方案
替换preg_replace(e修饰符)为preg_replace_callback的解决方案
原代码因PHP 7.4+废弃preg_replace的e修饰符触发警告,这里直接给出适配preg_replace_callback的修改版本:
$text = preg_replace_callback( "#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#si", function($matches) use ($uid) { // 提取正则捕获的分组内容 $protocol = $matches[1]; $urlSegment = $matches[3]; // 替换空格为URL编码的%20 $encodedSegment = str_replace(' ', '%20', $urlSegment); // 拼接成最终的替换字符串 return "[img:$uid]{$protocol}{$encodedSegment}[/img:$uid]"; }, $text );
关键修改说明:
- 移除了原正则末尾的
e修饰符,保留si(s让.匹配换行符,i忽略大小写) - 用匿名函数作为回调处理匹配结果,通过
use($uid)引入外部的$uid变量(原代码依赖该变量,必须显式传入回调) - 原代码中
\\1对应$matches[1](协议部分),\\3对应$matches[3](图片链接主体部分),直接通过数组访问即可 - 原替换字符串中的PHP代码逻辑,直接在回调函数中以原生PHP代码实现,避免了
e修饰符的安全风险和兼容性问题
内容的提问来源于stack exchange,提问作者Rovsan
相关产品推荐
相关产品推荐

