Php preg_replace删除除basename以外的url

Php preg_replace删除除basename以外的url,php,regex,Php,Regex,我得到了这个HTML: <p> <img src="../test/test2/test3/image.png"> <img src="../test/test2/test3/test4/image2.png"> </p> 我一直在考虑使用preg\u match来扫描URL,然后替换循环中的URL,但是单个preg\u替换会更整洁 我尝试了这个正则表达式,但我不知道如何使它足够贪婪,以便在不捕获其他HTML的情况下保留文件名。一个非贪婪

我得到了这个HTML:

<p>
  <img src="../test/test2/test3/image.png">
  <img src="../test/test2/test3/test4/image2.png">
</p>
我一直在考虑使用
preg\u match
来扫描URL,然后替换循环中的URL,但是单个preg\u替换会更整洁

我尝试了这个正则表达式,但我不知道如何使它足够贪婪,以便在不捕获其他HTML的情况下保留文件名。一个非贪婪的正则表达式只会在第一个子文件夹处停止

preg_replace('@\.\./test/.*/@', '', $content);

编辑:为清晰起见,此HTML是从数据库读取的,需要进行处理。这是一个例子,真正的HTML可能包含更多的链接和内容,所以我不能手动编辑。此外,我还熟悉basename()函数。我在这里寻找纯正则表达式解决方案。

regex:

(<img src=")(.*\/test.*\/)(.*)$
\1\3
<p>
  <img src="image.png">
  <img src="image2.png">
</p>

PHP代码应该是

<?php
$url = <<< 'EOT'
<p>
  <img src="../test/test2/test3/image.png">
  <img src="../test/test2/test3/test4/image2.png">
</p>
EOT;
$regex = '~(?m)(<img src=")(.*\/test.*\/)(.*)$~';
$replacement = "$1$3";
echo preg_replace($regex, $replacement, $url);
?>

除了前面或后面可能有其他标记外,此模式还应适用于您的示例

$pat = '@.*(<i.+c=")(.*\/)(.*">).*@';
$rep = "  " . '$1$3';

echo preg_replace($pat, $rep, $str);
$pat='@.*().@;
$rep=”“.”$1$3';
echo preg_替换($pat,$rep,$str);

在我的示例中这样做的时候,我看到我的HTML在DB中是单行的。更改正则表达式来解释这一点很容易吗?单行?我会试试。是的,我错了。我会接受你的回答,因为你为我的问题提供了第一个有效的答案。
$pat = '@.*(<i.+c=")(.*\/)(.*">).*@';
$rep = "  " . '$1$3';

echo preg_replace($pat, $rep, $str);