根据src url从字符串中删除图像

时间:2018-05-20 02:44:05

标签: php regex dom domdocument

我正在寻找一种简单有效的方法来从文章中删除特定图像。我所知道的只是我需要删除的图片的图片网址。

  • 图像可能使用也可能不使用不同的属性。
  • 文章中可能存在或可能不存在图像。
  • 文章中可能还有其他图片(不是相同的网址)。

我的选择可能是正则表达式或DOMDocument,可能使用像https://github.com/Masterminds/html5-php这样的HTML5解析器。

我的正则表达式技巧不是那么好,我不确定使用正则表达式来实现这一点是个好主意,因为我读到应该避免使用正则表达式来解析HTML。 到目前为止,我使用正则表达式,是删除完整的图像,但不知道如何根据特定的src网址删除它。

$img_src = 'http://www.example.org/image_to_be_removed.jpg';

$article = '<h1>Test article with HTML5 tags</h1>
<nav><a href="/link1/">Link 1</a></nav>
<p>This is an example article. The article may or may not include html5 tags, images and other things.</p>
<img src="http://www.example.org/image_to_be_removed.jpg">
<p>More example text.</p>';

$article = preg_replace("/<img[^>]+\>/i", "", $article);
echo $article;

我还没有深入研究DOMDocument解决方案,因为我不确定它是否可行,或者正则表达式可能被视为最佳实践?

4 个答案:

答案 0 :(得分:1)

使用preg_quote

$article = preg_replace("/<img[^>]+src=\"" . preg_quote($img_src, '/') . "\"[^>]*\>/i", "", $article);

Regex Demo

php Demo

答案 1 :(得分:0)

你可以试试这个。好像测试好了。无论如何,它应该让你知道如何继续。

$img_src = 'http://www.example.org/image_to_be_removed.jpg';

$article = '<h1>Test article with HTML5 tags</h1>
<nav><a href="/link1/">Link 1</a></nav>
<p>This is an example article. The article may or may not include html5 tags, images and other things.</p>
<img style="width:100px;" src="http://www.example.org/image_to_be_removed.jpg" class="myClass">
<p>More example text.</p>';

$article = preg_replace('/\s{1,}/', ' ', $article);  //Very important step to make sure only 1 space exist between any character.
$img_src = preg_replace('/\//', '\\/', $img_src); //Adds slashes to the url.
$regex = '/<img[\W\D\w]{0,}src=\"' . $img_src . '\"[\W\D\w]{0,}>\s/'; //Define the regex.
$article = preg_replace($regex, '', $article);
echo $article;

答案 2 :(得分:0)

您可以在下面尝试使用str_replace

<?php
$img_src = 'http://www.example.org/image_to_be_removed.jpg';

$article = '<h1>Test article with HTML5 tags</h1>
<nav><a href="/link1/">Link 1</a></nav>
<p>This is an example article. The article may or may not include html5 tags, images and other things.</p>
<img src="http://www.example.org/image_to_be_removed.jpg">
<p>More example text.</p>';
$new = str_replace('src="http://www.example.org/image_to_be_removed.jpg"','',$article);
echo $article;
echo '<br/>';
echo $new;
?>

你的代码和str_replace都有preg_replace来注意deference。 还有其他功能可以像sprintf,strtr,str_replace和preg_replace那样使用任何套件

答案 3 :(得分:0)

使用正则表达式解析html是not recommended

根据您的建议,您可以使用DOMDocument或例如PHP Simple HTML DOM Parser

因为您声明“我所知道的是我需要删除的图像的图像URL”,您可以使用xpath找到img标记的src属性,或者查找标记名称并检查它。

示例DOMDocument:

$img_src = 'http://www.example.org/image_to_be_removed.jpg';
$article = '<h1>Test article with HTML5 tags</h1>
<nav><a href="/link1/">Link 1</a></nav>
<p>This is an example article. The article may or may not include html5 tags, images and other things.</p><img src="http://www.example.org/image_to_be_removed.jpg"><img src="http://www.example.org/image_not_to_be_removed.jpg"><p>More example text.</p>\';
<p>More example text.</p>';
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($article);
$xpath = new DOMXPath($dom);
$elements = $xpath->query("//img");
foreach ($elements as $elememnt) {
    if ($elememnt->getAttribute("src") === $img_src) {
        $elememnt->parentNode->removeChild($elememnt);
    }
}
echo $dom->saveHTML();

示例PHP使用simple_html_dom.php的简单HTML DOM解析器:

$htmlDom = str_get_html($article);
foreach($htmlDom ->find('img[src=http://www.example.org/image_to_be_removed.jpg]') as $item) {
    $item->outertext = '';
}
$htmlDom->save();
echo $htmlDom;