当前位置: 首页 > 知识库问答 >
问题:

Preg_replace不会移除带有src地址的每个img标签

万浩淼
2023-03-14

我正在我的PHP上工作,以搜索特定地址的图像,所以我想删除所有这些img标签。

我有这样显示的img标签:

<img src="http://example.com/someimage1.jpeg">
<img src="http://example.com/someimage2.jpeg">
<img src="http://example.com/someimage3.jpeg">
<img src="http://example.com/someimage4.jpeg">
<img style="OVERFLOW: hidden; WIDTH: 0px; MAX-HEIGHT: 0px" alt="" src="http://test.mydomain.com/project433q325/track/Images/signature.gif?id=446&amp;etc=1586624376">

当我尝试这个:

foreach ($src as $image) {
    $image = preg_replace("\<img src\=\"(.+)\"(.+)\/\>/i", '', $src);
}

它不会删除img标签,因此我也尝试了以下方法:

foreach ($src as $image) {
    $image = preg_replace("/<img[^>]+\>/i", "", $src); 
}

我仍然有相同的问题,因为它不会删除img标签。

以下是完整的代码:

if (strpos($inbox_message, 'http://test.mydomain.com/project433q325/track/Images/signature.gif?') !== false) {
    $doc = new DOMDocument();
    $doc->loadHTML($inbox_message);
    $xpath = new DOMXpath($doc);
    $src = $xpath->evaluate("string(//img/@src)");

    if ($src) {
        foreach ($src as $image) {
            //image->nodeValue = preg_replace('<img.*?src='.$src.'.*?/>!i', '', $src);
            //$src = preg_replace("/<img[^>]+\>/i", "", $src);
            $image = preg_replace("\<img src\=\"(.+)\"(.+)\/\>/i", '', $src);
        //}
    }
    $inbox_message = $doc->saveHTML();
} 

我想做的是,我只想搜索带有src地址的img标签,该地址显示'http://test.mydomain.com/project433q325/track/Images/signature.gif?“把它们拿走。

你能给我看一个例子,如何搜索每个有特定src地址的img标签,这样我就可以用preg_replace删除每个img标签了吗?

非常感谢。

编辑:这里是$inbox_message变量

$inbox_message = '<img src="http://example.com/someimage1.jpeg"><img src="http://example.com/someimage2.jpeg"><img src="http://example.com/someimage3.jpeg"><img src="http://example.com/someimage4.jpeg"><img style="OVERFLOW: hidden; WIDTH: 0px; MAX-HEIGHT: 0px" alt="" src="http://test.mydomain.com/project433q325/track/Images/signature.gif?id=446&amp;etc=1586624376">';

共有2个答案

韦叶秋
2023-03-14

要删除所有img标记,请使用以下正则表达式模式:

<img\s+[^>]+>

https://regex101.com/r/HfStzZ/1

要包括您在问题中描述的特定srcurl,请使用以下正则表达式模式:

<img\s+[^>]*\bsrc="[^"]*\/signature\.gif[^\>]*\>

https://regex101.com/r/HfStzZ/2

在PHP中,使用preg\u replace命令如下:

$output = preg_replace('/<img\s+[^>]*\bsrc="[^"]*\/signature\.gif[^\>]*\>/', '', $input);
戎高爽
2023-03-14

您不应该为此使用正则表达式。您可以原样使用strop,但将其移动到DOM解析中,并比较每个img。然后可以使用removeChild()删除相应的图像。(这是如何使用DOMDocument删除元素的改编答案?)

<?php
$inbox_message = '<p> Keep This</p><img src="http://example.com/someimage1.jpeg"><img src="http://example.com/someimage2.jpeg"><img src="http://example.com/someimage3.jpeg"><img src="http://example.com/someimage4.jpeg"><h1>Fake element</h1><img style="OVERFLOW: hidden; WIDTH: 0px; MAX-HEIGHT: 0px" alt="" src="http://test.mydomain.com/project433q325/track/Images/signature.gif?id=446&amp;etc=1586624376">';
$doc = new DOMDocument();
$doc->loadHTML($inbox_message);
$imgs = $doc->getElementsByTagName('img');
for($i = $imgs->length; --$i >= 0;){
    $node = $imgs->item($i);
    if (strpos($node->getAttribute('src'), 'http://test.mydomain.com/project433q325/track/Images/signature.gif?') !== false) {
        $node->parentNode->removeChild($node);
    }
}
echo $doc->savehtml();

https://3v4l.org/qinLR

如果$node-,您也可以使用strtolpower

对于正则表达式问题。。。

preg_replace("\<img src\=\"(.+)\"(.+)\/\>/i", '', $src);

正则表达式的开头试图使用不是有效分隔符的反斜杠<代码>分隔符可以是任何非字母数字、非反斜杠、非空白字符。起始分隔符必须与结束分隔符匹配。此外,您的$src仅包含属性so

如果你要让.发挥作用,需要用你想要检查的URI替换。

但在这里,regex确实是错误的方法。对这些类型的作业使用解析器。正则表达式不应用于结构化数据。如果它是结构化的,那么很可能已经为它编写了函数。

 类似资料:
  • 问题内容: 我在jsp页面中有一个img标签,其中src路径要求传递标头参数来获取图像。我们如何实现呢? 问题答案: 首先,您需要发出一个设置头文件的ajax请求。然后,您需要使用一些HTML5 API将接收到的二进制数据转换为base64。最后,使用协议和base64数据设置映像src 。 资料来源: https://developer.mozilla.org/zh- CN/docs/Web/A

  • 我试图从PHP中删除“img src”标签,这样它就可以简单地显示图像网址,而不是显示实际图像。这是我到目前为止得到的代码,它工作得很好,但是当它呈现时,它显示缩略图而不是网址。 我知道有办法做到这一点,但我不知道如何在不破坏图像代码的情况下删除标签。感谢您的帮助。

  • 因此,我在Django中有我的views.py,它将对象列表呈现给我的html模板。一切正常。现在,这些对象有一些与之关联的对象ID。我将“static/images/”目录中的图像命名为与对象ID相同的名称。 因此,图像1.jpg将对应于对象id=1的对象,2.jpg对象id=2,依此类推。 现在我想在html中加载img标记中的图像,但是img标记的src URL将取决于对象id。 以下是我的

  • 问题内容: 我了解如何使用精灵,但是IMG标签不是必需的“ src”属性吗?我总是可以使用SPAN或其他标签并设置background / width / etc,但从语义上讲不会正确。 基本上,我想为IMG标签省略SRC,而只使用精灵,但是我担心HTML在技术上因此无效。谢谢。 问题答案: 关于语义正确性: 当图像具有语义时, 因此被认为是内容,请 使用IMG标签 (不带图片)和正确设置的ALT

  • HTTP Content-Security-Policy: img-src指令指定图像和网站图标的有效来源。 CSP版本 1 指令类型 Fetch指令 default-src fallback 是。如果此指令不存在,用户代理将查找default-src指令。 句法 img-src政策可以允许一个或多个来源: Content-Security-Policy: img-src <source>;Con

  • 问题内容: 我用来加载图像。值是从一些范围变量加载的,如下所示: 我的问题是,当我运行时,它会使属性为空,但不会在属性中反映出来。因此,我不断看到需要空占位符的图像。 我该如何处理? 问题答案: 这是ngSrc和ngHref指令的预期行为。这些指令仅支持识别新路径,但是当路径不可用时,这些指令将以静默方式退出(我在这里看到一个拉取请求。)。 因此,当图像变量不再可用时,可能的解决方法是将ngSho