收到警告,因为 preg_replace 函数上的 e 修饰符已弃用。 这是代码,我建议应该用 preg_replace_callback 函数替换(对于 php 7.4.16):
`$text = preg_replace("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#sie", "'[img:$uid]\\1' . str_replace(' ', '%20', '\\3') . '[/img:$uid]'", $text);`
我已经尝试修复它有一段时间了,但似乎无法使其正常工作,因此我们将非常感谢任何帮助。
我无法应用这里解释的逻辑: https://stackoverflow.com/questions/15454220/replace-preg-replace-e-modifier-with-preg-replace-callback
代码中的这部分不会替换任何内容
str_replace(' ', '%20', '\\3')
,因为第 3 组值具有与空格不匹配的否定字符类。
要将空格替换为
%20
,您可以仅使用单个捕获组,而不是正则表达式中的 5 个捕获组。
模式中有一些多余的转义符,您可以将
[^ \n\r\t]
缩短为 [^\s]
如果想在回调函数中使用
$uid
,可以这样写use ($uid)
如果您不匹配任何空格,您可以使用 preg_replace_callback 例如,如下所示:
$text = "[img]http://www.test.com/abc.jpg[/img]";
$uid = 123;
$text = preg_replace_callback(
"#\[img]((?:https?|ftps?)://[^\s?&=\#\"<]*?\.(?:jpe?g|gif|png))\[/img]#i",
function ($m) use ($uid) {
return "[img:$uid]" . $m[1] . "[/img:$uid]";
},
$text
);
echo $text;
输出
[img:123]http://www.test.com/abc.jpg[/img:123]
如果您要匹配任何空格,您可以使用:
$text = "[img]http://www.test.com/ abc.jpg[/img]";
$uid = 123;
$text = preg_replace_callback(
"#\[img]((?:https?|ftps?)://[^?&=\#\"<]*?\.(?:jpe?g|gif|png))\[/img]#i",
function ($m) use ($uid) {
return "[img:$uid]" . str_replace(' ', '%20', $m[1]) . "[/img:$uid]";
},
$text
);
echo $text;
输出
[img:123]http://www.test.com/%20%20abc.jpg[/img:123]