由于 e 修饰符弃用,将 preg_replace 替换为 preg_replace_callback

问题描述 投票:0回答:1

收到警告,因为 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

preg-replace preg-replace-callback
1个回答
0
投票

代码中的这部分不会替换任何内容

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]
© www.soinside.com 2019 - 2024. All rights reserved.