如何替换群组匹配,保持其他所有内容完整无缺?

时间:2017-07-20 20:04:53

标签: php regex regex-group

正则表达式不是我的强项,我可能会过于复杂,但我已经设法出现了满足我需求的模式。

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

这是一个演示:

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

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

我已经弄清楚如何使用preg_match_all获取匹配但我不知道如何进行替换并将其注入原始文本块。

为了给出一些背景知识,这是尝试解决新的热链接策略,目的是让我的PHP脚本浏览我的phpBB论坛上的所有消息并进行上面的搜索和替换,然后更新帖子,如果有的话匹配/替换。如果它可以直接在MySQL中完成,但我还是想在我跑步之前走路!

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

 $replace = "$1$2~original$3";

非常简单 - 您只需重写原始文本的匹配部分,以包含"〜原创"你想要的。

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

$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 = "$1$2~original$3";

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

答案 1 :(得分:1)

是的,你可以做全局替换,只需使用适当的捕获组。

.jpg[/img:jaeyh8wg]
\ ^
由于您要在此处插入,因此您只需要两个组即可将其拆分。

此外,由于您正在寻找最接近的封口,因此最好使用
非贪心量词.*?

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

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