我有这个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()函数。我在这里寻找纯正则表达式解决方案。
答案 0 :(得分:1)
<强>正则表达式:强>
(<img src=")(.*\/test.*\/)(.*)$
替换字符串:
\1\3
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);