如何更换小组赛,保持其他一切完好无损?

How to replace the group match, keeping everything else intact?

正则表达式不是我的强项,我可能把它过于复杂化了,但我设法想出了一个似乎满足我需要的模式。

\[img.*\].*photobucket.*(.jpg)\[\/img.*\]

这是一个演示:

https://regex101.com/r/fo98tP/6

我想用“.jpg~original”替换组匹配(即“.jpg”)。

我已经想出如何与 preg_match_all 匹配,但我不知道如何进行替换并将其重新注入原始文本块。

为了提供一些背景信息,这是为了尝试解决新的热链接政策,目的是让我的 PHP 脚本遍历我的 phpBB 论坛上的所有消息并进行搜索和替换,然后如果有 match/replacement,则更新 post。如果它可以直接在 MySQL 中完成,那就更好了,但我正在尝试在 运行!

之前走路

非常感谢任何帮助;我头疼!

我认为您正在寻找 preg_replace($pattern, $replacement, $text)

所以假设你的正则表达式是正确的,它似乎是有效的。 (就我个人而言,我会做一些小的修改,比如将 \[img.*\] 更改为 \[img[^]]*\],但这可能只是一种风格问题)。您需要做的就是再添加两个捕获组。

(\[img.*\].*photobucket.*)(.jpg)(\[\/img.*\])

这允许您在替换中使用引用这些捕获组。

 $replace = "~original";

非常简单 - 您只是重写原文的匹配部分以包含您想要的“~original”。

整个代码块可能如下所示:

$text = "Steering damper mounts finished - without the connecting rod the damper would get bent:
[url=http://s557.photobucket.com/user/realboss7669/media
/C85A0F5D-413D-4779-9F09-
BD43BB798238_zpse8s6dxyu.jpg.html:jaeyh8wg]
[img:jaeyh8wg]http://i557.photobucket.com/albums
/ss16/realboss7669/C85A0F5D-413D-4779-9F09
BD43BB798238_zpse8s6dxyu.jpg[/img:jaeyh8wg][/url:jaeyh8wg]";

$pattern  = "/(\[img.*\].*photobucket.*)(.jpg)(\[\/img.*\])/i";

$replace = "~original";

 $text = preg_replace($pattern, $replace, $text);

是的,您可以进行全局替换,只需使用适当的捕获组即可。

.jpg[/img:jaeyh8wg]
\ ^
既然要在这里插入,那么只需要分成两组就可以了。

此外,由于您正在寻找最近的闭包,最好使用
非贪婪量词 .*?

https://regex101.com/r/fo98tP/10

所以这是一个
查找 (\[img.*?\].*?photobucket.*?.jpg)(\[\/img.*?\])
替换 ~original