我有一个Regex检测某种类型的链接。检测部分工作正常,是替换部分坏了。我试着替换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
}
我需要用_thumb_
替换src中的_post_notif_
。我该怎么做?
解决了@OnlineCop
在下面的正则表达式中,将第二个捕获的组替换为_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
IDEONE
解释:
-
(cover_photos_s'/[a-z0-9A-Z]+)
捕获到_
之前出现的字符串post
。 -
(_'w+?_'w+?_)
从下划线开始,它匹配到第一个下划线之前最短的单词字符,因此它匹配字符串_post
。它再次匹配到字符串notif
,因为+
符号之后的?
运算符使正则表达式引擎匹配最短的可能性加上下面的_
符号。因此,反过来regex引擎捕获第二组字符。 - 它们旁边的所有字符被捕获到第三组。
- 在替换部分,将第二组替换为您的字符串将得到所需的输出。
如果是文字:使用str_replace
如果_post_notif_
是一个文字,你可以使用:
$replaced = str_replace("_post_notif_","",$link);
如果是变量:使用'K
如果_post_notif_
实际上是一个总是有3个下划线的变量,如_post_notif_
,那么你可以使用以下正则表达式进行直接替换:
[^/]+/[^_]+'K_(?:[^_]+_){2}
PHP: = preg_replace取代美元 ('~[^/]+/[^ '] + K (?: [^ ] + ) {2 }~', '', $
链接);-
[^/]+
匹配任何不是'/'的字符 -
/
匹配/
-
[^_]+
匹配任何不是' _'的字符 -
'K
告诉引擎放弃到目前为止与最终 匹配的内容 -
_
匹配第一个_
-
(?:[^_]+_){2}
匹配其余变量(无下划线+ 1下划线,两次)