我有一个正则表达式,可以检测到某种类型的链接。检测部分可以正常工作,它可以替代工作。我尝试替换http://regex101.com/
代码:
$link="cover_photos_s/yasinallana1984751717_post_notif_aurora_kuenzli_big.jpg";
//regex
$reg_for_key="~((cover_photos_s\/)([a-zA-Z0-9]+)(_post_notif_)(\w+)(.[a-z]+))~i";
if(preg_match_all($reg_for_key,$link))
{
//the replace string goes here
}
我需要用_post_notif_
替换src中的_thumb_
。我该怎么办?
解决thnx到@OnlineCop
答案 0 :(得分:1)
在下面的正则表达式中,将第二个捕获的组替换为_thumb_
,
^(cover_photos_s\/[a-z0-9A-Z]+)(_\w+?_\w+?_)(.*)$
您的PHP代码将是,
<?php
$link = "cover_photos_s/yasinallana1984751717_post_notif_aurora_kuenzli_big.jpg";
$reg_for_key = "~^(cover_photos_s\/[a-z0-9A-Z]+)(_\w+?_\w+?_)(.*)$~";
$replacement = "$1_thumb_$3";
echo preg_replace($reg_for_key, $replacement, $link);
?> //=> cover_photos_s/yasinallana1984751717_thumb_aurora_kuenzli_big.jpg
<强>解释强>
(cover_photos_s\/[a-z0-9A-Z]+)
捕获字母_
之前的post
。(_\w+?_\w+?_)
从下划线开始,它匹配最短字符到第一个下划线,因此它匹配字符串_post
。同样,它匹配字符串notif
,因为在?
符号后+
运算符使正则表达式引擎匹配最短可能性加上以下_
符号。因此反过来,正则表达式引擎捕获第二组字符。答案 1 :(得分:0)
如果它是文字:使用str_replace
如果_post_notif_
是文字,您可以使用:
$replaced = str_replace("_post_notif_","",$link);
如果它是变量:使用\K
如果_post_notif_
实际上是一个总是有3个下划线的变量,例如_post_notif_
,那么你可以使用这个正则表达式进行直接替换:
[^/]+/[^_]+\K_(?:[^_]+_){2}
在PHP中:
$ replacement = preg_replace(&#39;〜[^ /] + / [^ ] + \ K (?:[^ ] + ){2} 〜&#39;,&#39;&#39;,$ link);
<强>解释强>
[^/]+
匹配任何不是`/&#39; /
与/
[^_]+
匹配任何不是`_&#39; \K
告诉引擎放弃与最终匹配的内容_
与第一个_
(?:[^_]+_){2}
匹配其余变量(无下划线+ 1下划线,两次)