如何替换链接中的文本组


how to replace group of texts in a link

我有一个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下划线,两次)