preg_replace删除除basename之外的url

时间:2014-07-25 10:16:03

标签: php regex

我有这个HTML:

<p>
  <img src="../test/test2/test3/image.png">
  <img src="../test/test2/test3/test4/image2.png">
</p>

../test始终存在,其他目录是可选的。

现在,我希望它看起来像这样:

<p>
  <img src="image.png">
  <img src="image2.png">
</p>

我一直在考虑preg_match来扫描网址,然后在循环中替换它们,但是单个preg_replace会更整洁。

我尝试了这个正则表达式,但是我无法弄清楚如何让它足够贪婪以保留文件名而不会捕获其他HTML。非贪婪的正则表达式将停留在第一个子文件夹中。

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

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

2 个答案:

答案 0 :(得分:1)

<强>正则表达式:

(<img src=")(.*\/test.*\/)(.*)$

替换字符串:

\1\3

DEMO

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);
?>

<强>输出:

<p>
  <img src="image.png">
  <img src="image2.png">
</p>

答案 1 :(得分:0)

此模式除了可能在其前面或后面有其他标签外,还应与您的示例一起使用。

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

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