我注意到这个老问题没有答案,所以我想我会提供一个可靠的解决方案。Ria的答案没有在结束标记中转义 /,因此在链接的演示中会导致错误。此外,当提供的样本加倍(将其与自身连接)时,Ria 的正则表达式模式会失败,因为它过于贪婪并抓取多个a标签,更不用说它比我的模式慢 4 倍以上。
模式解释(演示):
( #Start capture group
<a[^<]*> #Greedily match the opening a tag, no other tags
[^<]* #Greedily match characters of any length before <img
<img[^>]*> #Greedily match the whole img tag
[^<]* #Greedily match characters of any length after <img
<\/a> #Match the closing a tag
) #End capture group
代码(演示):
<?php
$string="<a href=\"/in-bai-viet--Choang-n20120711033726647.chn\" target=\"_blank\">In<img src=\"/Images/printer.png\" alt=\"In bài viết này\" />
</a>
<a target=\"_blank\" rel=\"nofollow\" href=\"http://ttvn.vn/\">Thiên Lam - TTVN
</a>
<a href=\"/tinh-yeu-hon-nhan/20120709102954599/Chay-lang-.chn\" title=\"'abc'\">
abcd
</a>
<a href=\"/in-bai-viet--Choang-n20120711033726647.chn\" target=\"_blank\">In<img src=\"/Images/printer.png\" alt=\"In bài viết này\" />
</a>
<a target=\"_blank\" rel=\"nofollow\" href=\"http://ttvn.vn/\">Thiên Lam - TTVN
</a>
<a href=\"/tinh-yeu-hon-nhan/20120709102954599/Chay-lang-.chn\" title=\"'abc'\">
abcd
</a>";
echo preg_replace('/(<a[^>]*>[^<]*<img[^>]*>[^<]*<\/a>)\r?\n?/si',NULL,$string);
?>
输出:
<a target="_blank" rel="nofollow" href="http://ttvn.vn/">Thiên Lam - TTVN
</a>
<a href="/tinh-yeu-hon-nhan/20120709102954599/Chay-lang-.chn" title="'abc'">
abcd
</a>
<a target="_blank" rel="nofollow" href="http://ttvn.vn/">Thiên Lam - TTVN
</a>
<a href="/tinh-yeu-hon-nhan/20120709102954599/Chay-lang-.chn" title="'abc'">
abcd
</a>
虽然这个问题可能已经在现实生活中得到解决和/或不再重要,但我只是想解决这个问题。