【问题标题】:Preg_replace wont remove each img tag with src addressPreg_replace 不会删除每个带有 src 地址的 img 标签
【发布时间】:2023-03-18 16:39:01
【问题描述】:

我正在使用我的 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();
} 

我想要做的是我只想搜索具有显示“http://test.mydomain.com/project433q325/track/Images/signature.gif?”的 src 地址的 img 标签并删除它们。

你能告诉我一个例子,我如何搜索具有特定 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">';

【问题讨论】:

  • 使用正则表达式来操作 HTML 会导致各种问题,我建议使用 DOM 解析器(DOMDocument 和 loadHTML)。
  • 我试过了,它不会删除它。
  • @NigelRen 能否请您发布我应该使用 DOM 解析器删除每个 img 标签的来源?

标签: php regex preg-replace html-parsing


【解决方案1】:

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

<img\s+[^>]+>

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


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

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

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


在 PHP 中,使用preg_replace 命令如下:

$output = preg_replace('/<img\s+[^>]*\bsrc="[^"]*\/signature\.gif[^\>]*\>/', '', $input);

【讨论】:

  • 我试过这个$inbox_message = preg_replace('&lt;img\s+[^&gt;]*\bsrc="http:\/\/test\.mydomain\.com\/project433q325\/track\/Images\/signature\.gif[^\&gt;]*\&gt;', "", $inbox_message); 它不会删除它。请帮忙。
【解决方案2】:

您不应该为此使用正则表达式。您可以像以前一样使用您的strpos,但将其移到DOM 解析中并比较每个img。然后,您可以使用removeChild() 删除相应的图像。 (这是来自How to delete element with 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-&gt;getAttribute('src') 可能包含不同的大小写,您也可以使用strtolower。在这种情况下,strpos 的指针也应该小写。

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

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

正则表达式的开头尝试使用不是有效delimiter 的反斜杠。 A delimiter can be any non-alphanumeric, non-backslash, non-whitespace character. 起始分隔符必须与结束分隔符匹配。此外,您的 $src 仅包含属性的值,因此 &lt;img src... 永远不会匹配。

如果您要获得该功能,则需要将 .+ 替换为您要检查的 URI。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多