Preg_replace 不会删除每个带有 src 地址的 img 标签
Preg_replace wont remove each img tag with src address
我正在 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&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?”的 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&etc=1586624376">';
要删除所有 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);
你不应该为此使用正则表达式。您可以像以前一样使用 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&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();
如果 $node->getAttribute('src')
可能包含不同的大小写,您也可以使用 strtolower
。在这种情况下,strpos
的指针也应小写。
对于正则表达式问题...
preg_replace("\<img src\=\"(.+)\"(.+)\/\>/i", '', $src);
正则表达式的开头正试图使用无效的反斜杠 delimiter。 A delimiter can be any non-alphanumeric, non-backslash, non-whitespace character.
起始分隔符必须与结束分隔符匹配。此外,您的 $src
仅包含属性值,因此 <img src...
永远不会匹配。
如果您要使其正常运行,则需要将 .+
替换为您要检查的 URI。
但是正则表达式在这里确实是错误的方法。像以前一样,为这些类型的工作使用解析器。正则表达式不应用于结构化数据。如果它是结构化的,那么可能已经为它编写了函数。
我正在 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&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?”的 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&etc=1586624376">';
要删除所有 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);
你不应该为此使用正则表达式。您可以像以前一样使用 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&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();
如果 $node->getAttribute('src')
可能包含不同的大小写,您也可以使用 strtolower
。在这种情况下,strpos
的指针也应小写。
对于正则表达式问题...
preg_replace("\<img src\=\"(.+)\"(.+)\/\>/i", '', $src);
正则表达式的开头正试图使用无效的反斜杠 delimiter。 A delimiter can be any non-alphanumeric, non-backslash, non-whitespace character.
起始分隔符必须与结束分隔符匹配。此外,您的 $src
仅包含属性值,因此 <img src...
永远不会匹配。
如果您要使其正常运行,则需要将 .+
替换为您要检查的 URI。
但是正则表达式在这里确实是错误的方法。像以前一样,为这些类型的工作使用解析器。正则表达式不应用于结构化数据。如果它是结构化的,那么可能已经为它编写了函数。