Preg_replace не удалит каждый тег img с адресом sr c - PullRequest
0 голосов
/ 18 апреля 2020

Я работаю над своим PHP для поиска изображений, которые приходят по указанному адресу c, поэтому я хочу удалить все эти теги 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();
} 

Я пытаюсь найти только теги img с адресом sr c, который показывает 'http://test.mydomain.com/project433q325/track/Images/signature.gif?' и удалите их.

Можете ли вы показать мне пример того, как я могу искать каждый тег img с указанным адресом c sr c, чтобы я мог удалить каждый тег img с помощью preg_replace?

Спасибо.

РЕДАКТИРОВАТЬ: Вот переменная $ 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 ]

2 голосов
/ 18 апреля 2020

Вы не должны использовать регулярные выражения для этого. Вы можете использовать ваш 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

Вы также можете использовать strtolower, если $node->getAttribute('src') может содержать различные регистры. В этом случае стрелка для strpos также должна быть в нижнем регистре.

Для проблем с регулярными выражениями ...

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

При запуске регулярного выражения используется обратная коса sh, которая не является действительным разделителем . A delimiter can be any non-alphanumeric, non-backslash, non-whitespace character. Начальный разделитель должен соответствовать конечному разделителю. Кроме того, ваш $src содержит только значение атрибута, поэтому <img src... никогда не совпадет.

Если вы хотите, чтобы это функционировало, .+ необходимо будет заменить на URI, с которым вы хотите проверить.

НО регулярное выражение здесь действительно неправильный подход. Используйте синтаксический анализатор, как вы, для этих типов работ. Регулярное выражение не должно использоваться для структурированных данных. Если он структурирован, то, скорее всего, для него уже написаны функции.

0 голосов
/ 18 апреля 2020

Чтобы удалить все теги img, используйте следующий шаблон регулярных выражений:

<img\s+[^>]+>

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


Для включения указанных c src url, как вы описали в своем вопросе, используйте следующий шаблон регулярных выражений:

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

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


In PHP, используйте команду preg_replace следующим образом:

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