如何更换小组赛,保持其他一切完好无损?
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
正则表达式不是我的强项,我可能把它过于复杂化了,但我设法想出了一个似乎满足我需要的模式。
\[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