如何从文本中删除所有img标记,除了包含某个单词的那些标记

时间:2011-03-04 23:02:30

标签: php regex preg-replace

我想从某个文本中删除所有img标记,但包含某个关键字的文章除外(例如,它们所托管的域名)。

这是我想出来的,但我担心它不起作用:

 $text = preg_replace("/<img[^>]+(?!keyword)[^>]+\>/i", "", $text); 

任何帮助都会非常感激! :)

2 个答案:

答案 0 :(得分:5)

使用DOMDocument::loadHTML?它在引擎盖下使用libxml,速度快而且健壮。

请勿尝试使用正则表达式解析HTML。

我做得那么大胆,因为我在这里看到了很多,解决方案总是脆弱,最糟糕的是错误。一旦你使用真正的HTML解析器来获得你想要的属性,那么使用正则表达式会更合理。

[update] - 即使这是来自Wordpress你应该没问题,因为它需要一个字符串作为参数。

  

该函数解析包含的HTML   在字符串源中。与装载不同   XML,HTML不一定是   良好的装载形式。

以下内容应该让你去...

$doc = new DOMDocument();
$doc->loadHTML($var);
$images = $doc->getElementsByTagName('img');

答案 1 :(得分:0)

使用回调来简化任务:

$html = preg_replace_callback('/<img\s[^>]+>/i', "cb_keyword", $html);

function cb_keyword($matches) {  // return empty str or original text
    return !strpos($matches[0], "keyword") ? "" : $matches[0];
}

如果您正在使用phpQuery / QueryPath处理HTML片段仍然可以,但会增加更多的后期处理。