Regex Удалить изображения с тегом стиля из HTML - PullRequest
3 голосов
/ 05 мая 2010

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

так например

<img src="" style="display:none" />

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

и т.д ...

Пока мой Regex:

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

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

Ответы [ 4 ]

4 голосов
/ 05 мая 2010

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

3 голосов
/ 05 мая 2010
$html = preg_replace("/<img[^>]+style[^>]+none[^>]+>/", '', $html);
0 голосов
/ 05 мая 2010

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

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

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

0 голосов
/ 05 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...