Регулярное удаление изображений с тегом стиля из Html

Я новичок в Regex, однако я решил, что это самый простой путь к тому, что мне нужно было сделать. В основном у меня есть строка (в PHP), которая содержит весь код HTML-кода … Я хочу удалить любые теги, которые имеют стиль = display: none …

так, например,

  • PHP-сессия для отслеживания уникальных просмотров страниц
  • Соединение Mongodb на PHP не работает
  • удалить тег версии xml, когда xml создается в php
  • Laravel 4 - протоколирование SQL-запросов
  • Каково использование символа @ в PHP?
  • Получить исходный URL-референт с PHP?
  • <img src="" style="display:none" />

    <img src="" style="width:11px;display: none" >

    и т.д…

    Пока мое Regex:

    <img.*style=.*display.*:.*none;.* >

    Но это, кажется, оставляет бит html позади, а также убирает следующий элемент при использовании в php с preg_replace.

  • Как преобразовать SOAP-ответ в PHP-массив?
  • PHP .htaccess -> довольно url (в обратном порядке)
  • Получение вложенной модели набора в <ul>, но скрытие «закрытых» поддеревьев
  • Лучший способ проверить, вернулись ли результаты MySQL в PHP?
  • Как найти ширину изображения с помощью PHP?
  • Php parse links / emails
  • 4 Solutions collect form web for “Регулярное удаление изображений с тегом стиля из Html”

    Как указал Майкл , вы не хотите использовать Regex для этой цели. Regex не знает, что такое тег элемента. <foo> имеет значение как >foo< если вы не учите этому разницу. Однако преподавание разницы невероятно утомительно.

    DOM намного удобнее:

     $html = <<< HTML <img src="" style="display:none" /> <IMG src="" style="width:11px;display: none" > <img src="" style="width:11px" > HTML; 

    Вышеупомянутая наша (недействительная) разметка. Мы кормим его DOM следующим образом:

     $dom = new DOMDocument(); $dom->loadHtml($html); $dom->normalizeDocument(); 

    Теперь мы запрашиваем DOM для всех элементов «IMG», содержащих атрибут «style», который содержит текст «display». Мы могли запросить «display: none» в XPath, но наша разметка ввода имеет вхождения без пробела между ними:

     $xpath = new DOMXPath($dom); foreach($xpath->query('//img[contains(@style, "display")]') as $node) { $style = str_replace(' ', '', $node->getAttribute('style')); if(strpos($style, 'display:none') !== FALSE) { $node->parentNode->removeChild($node); } } 

    Мы перебираем узлы IMG и удаляем все пробелы из их атрибутов атрибутов стиля. Затем мы проверяем, содержит ли он «display: none», и если это так, удалите элемент из DOM.

    Теперь нам нужно только сохранить наш HTML:

     echo $dom->saveHTML(); 

    дает нам:

     <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html><body><img src="" style="width:11px"></body></html> 

    Винт Regex!


    Приложение: вас также может заинтересовать оформление XML-документов с помощью селекторов CSS

     $html = preg_replace("/<img[^>]+style[^>]+none[^>]+>/", '', $html); 

    Поскольку <img> не допускает никаких других элементов внутри него, это возможно; но в общем случае regexp является очень плохим инструментом для анализа рекурсивно определенного языка, такого как HTML.

    Во всяком случае, проблема, с которой вы, вероятно, сталкиваетесь, заключается в том, что закрытие> соответствует одному из выражений. *, И, оказывается, будет более поздняя строка> в строке, соответствующая вашему явному значению>.

    Если вы замените все ваши. * На [^>] *, что предотвратит это. (Они, вероятно, не все должны быть заменены, но вы также можете).

    Ваше регулярное выражение слишком широкое; .* означает «соответствовать чему-либо», поэтому это будет соответствовать:

     <img src="foo.png" style="something">Some random displayed text : foo none; bar<br> 

    По крайней мере, вы, вероятно, хотите исключить закрывающие скобки из своих совпадений, поэтому [^>]* вместо .* . Вы также можете прочитать это , и изучите использование того, что действительно понимает HTML, например DOMDocument

    PHP is the Best Programming Language in the world.