正则表达式否定与部分字符串的否定匹配

时间:2014-08-04 13:59:50

标签: php regex preg-match-all

我已经尝试了几个版本,负面的前瞻或负面的外观,在SO和整个网络上找到,但我无法让它工作。

我想从大量文本中提取html链接,除非它们以图像为基础。 例子:

<a href="somelink">sometext</a>  <-- match and grab somelink
<a href="anotherlink"><img src="someimage"></a>  <-- ignore link

我试过

preg_match_all('/<a href="(.*?).*?>.*?<\/a>^((?!<img).)*/', $string), $matches);
preg_match_all('/<a href="(.*?).*?>.*?<\/a>(?<!img )/', $string, $matches);

和其他类似版本

1 个答案:

答案 0 :(得分:0)

我们不要使用正则表达式。解析HTML,获取所有锚标记并检查它们是否包含<img>元素。

<?php
$html = '<a href="somelink">sometext</a><a href="anotherlink"><img src="someimage"></a>';

$doc = new DOMDocument();
$doc->loadHTML($html);

$anchors = $doc->getElementsByTagName('a');
foreach ($anchors as $a) {
    if ($a->getElementsByTagName('img')->length === 0)
        echo $doc->saveHTML($a);
}

是的,它更长,但它也是一个更具可读性和相当自我记录的地狱。

输出:

<a href="somelink">sometext</a>