正则表达式找到里面不包含标签IMG的所有A标签?

时间:2012-07-12 03:54:11

标签: php regex

我有一个HTML代码:

<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>

我需要删除所有不包含img标签的标签。 我正在使用这个正则表达式:

preg_replace('/<a(.*)[^img](.*)<\/a>/si', '', $string);

我还在Regular expression, how to find all tags A which do not contain tag IMG inside it?中尝试了^(?!.+<img.+)<a href=\"?\'?.+\"?\'?>.+</a>$,但失败了。

谢谢

2 个答案:

答案 0 :(得分:0)

使用这个:

(<a[^<]*>.*<img[^>]*>[^<]*</a>)

并替换为null字符串。 It tested here

答案 1 :(得分:0)

我注意到这个老问题没有勾选答案,所以我想我会提供一个可靠的解决方案。 Ria的回答并没有在结束 a 标签中转义/,因此导致链接演示出错。此外,当提供的样本加倍(将其与自身连接)时,Ria的正则表达式模式失败,因为它太贪婪并且抓取多个 a 标记,更不用说它比我的模式。

模式说明(demo):

(               #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

代码(demo):

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

虽然这个问题可能已经在现实生活中得到解决和/或不再重要,但我只想把这个问题放在一边。