php 从内容 img 字符串中查找并删除

php find and remove from content img string

我有一个小问题,如何正确找到以 dealer.jpg 结尾的 img src 字符串并从我的内容中仅删除该字符串?例如:

<?php
$content = '<b>this is a content</b><img src=http://adress.com/as5.jpg><br> this is a content <img src=http://www.another-adress.com/dealer.jpg>';
$inf = explode("/dealer.jpg", $content);
$string = str_replace("<img src=\"$inf[0]/dealer.jpg\">", "", $content);
?>

我用这个是因为我不知道图像 link,link 总是另一个,但我知道这个 link 以 dealer.jpg 结尾,而这个脚本不是工作...所以有人可以帮助我如何正确地做到这一点?通常我想从我抓取的页面中删除广告。谢谢!

如果我没理解错的话,您是在尝试删除以 "dealer.jpg" 结尾的 img 标签(无论域如何),对吗?试试这个:

$content = '<b>this is a content</b><img src=http://adress.com/as5.jpg><br> this is a content <img src=http://www.another-adress.com/dealer.jpg>';
$content = preg_replace('/<img src=[A-z0-9-_":\.\/]+\/dealer\.jpg>/', '', $content);
var_dump($content);

编辑

第二个示例将匹配 img 标签,即使它具有其他属性,例如 altwidth 等(但同样,必须以 "dealer.jpg" 结尾)

$content = '<b>this is a content</b><img src="http://adress.com/as5.jpg"><br> this is a content <img alt="dealer-image" width="120" height="40" src="http://www.another-adress.com/dealer.jpg">';
$content = preg_replace('/<img[A-z0-9-_:="\.\/ ]+src="[A-z0-9-_:\.\/]+\/dealer\.jpg">/', '', $content);
var_dump($content);

Obs:我更改了初始 $content 因为我注意到它缺少 src 属性的双引号。不确定是不是拼写错误,或者您的字符串真的像这样。

编辑 2

这里是一个使用 DOM 的例子(猜测这是最好的方法,因为属性的顺序可能会改变):

$content = '<b>this is a content</b><img src="http://adress.com/as5.jpg"><br> this is a content <img alt="dealer-image" width="120" height="40" src="http://www.another-adress.com/dealer.jpg">';

// creates a DOMDocument based on your string, and wraps it in a div
$dom = new DOMDocument();
$dom->loadHTML("<div>{$content}</div>", LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);

// get all img tags
$imgs = $dom->getElementsByTagName('img');
foreach ($imgs as $img) { // if they have that src, remove it from $dom
    if (strpos($img->getAttribute('src'), 'dealer.jpg')) {
        $img->parentNode->removeChild($img);
    };
}

// get all the content of my first div, and print it
$newContent = $dom->getElementsByTagName('div')->item(0);
foreach ($newContent->childNodes as $childNode) {
    var_dump($dom->saveHTML($childNode));
}