Как Майкл указал , вы не хотите использовать 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