Регулярное выражение для выборочной зачистки HTML

Я пытаюсь проанализировать некоторый HTML с PHP как упражнение, выведя его как текст, и я попал в ловушку. Я хотел бы удалить теги, которые скрыты с помощью style="display: none;" – учитывая, что тег может содержать другие атрибуты и свойства стиля.

Код, который у меня есть, следующий:

 $page = preg_replace("#<([az]+).*?style=\".*?display:\s*none[^>]*>.*?</\1>#s","",$page);` 

Код, возвращающий NULL с PREG_BACKTRACK_LIMIT_ERROR .
Я попробовал это вместо этого:

 $page = preg_replace("#<([az]+)[^>]*?style=\"[^\"]*?display:\s*none[^>]*>.*?</\1>#s","",$page); 

Но теперь это просто не заменяет никаких тегов.

Любая помощь приветствуется. Благодаря!

Related of "Регулярное выражение для выборочной зачистки HTML"

Используя DOMDocument , вы можете попробовать что-то вроде этого:

 $doc = new DOMDocument; $doc->loadHTMLFile("foo.html"); $nodeList = $doc->getElementsByTagName('*'); foreach($nodeList as $node) { if(strpos(strtolower($node->getAttribute('style')), 'display: none') !== false) { $doc->removeChild($node); } } $doc->saveHTMLFile("foo.html"); 

Вы никогда не должны анализировать HTML с помощью Regex. Это заставляет ваши глаза кровоточить. HTML не является регулярным в любой форме. Он должен анализироваться с помощью DOM-парсера.

Разбор HTML для DOM с PHP

Разве мы этого не делали раньше?