为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
MMMHUHU 2022-12-30 16:13:43
我正在使用我的 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 标签?谢谢你。
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

你不应该为此使用正则表达式。您可以strpos像以前一样使用您的,但将其移动到 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


您也可以使用strtolowerif $node->getAttribute('src')might contain varying case。在这种情况下,针strpos也应该小写。


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


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

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


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


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


查看完整回答
反对 回复 2022-12-30
?
LEATH

TA贡献1936条经验 获得超6个赞

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

<img\s+[^>]+>

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


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

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

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


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

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



查看完整回答
反对 回复 2022-12-30
  • 2 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信