我想从某个文本中删除所有img标记,但包含某个关键字的文章除外(例如,它们所托管的域名)。
这是我想出来的,但我担心它不起作用:
$text = preg_replace("/<img[^>]+(?!keyword)[^>]+\>/i", "", $text);
任何帮助都会非常感激! :)
答案 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片段仍然可以,但会增加更多的后期处理。