Страницы

Поиск по вопросам

суббота, 7 марта 2020 г.

Регулярное выражение по HTML

#php #регулярные_выражения


У меня есть такой HTML-код:




Я составил для этого кода регулярное выражение:

\\\\\<\/div\>


Но оно, почему-то, пишет, что нет совпадений. Кто знает в чём дело?
    


Ответы

Ответ 1



Для манипуляций с HTML лучше пользоваться HTML-парсером. Вот пример использования PHP DomDocument для удаления определенных тегов вместе с их содержимым: $html = <<

Start

DATA; $dom = new DOMDocument('1.0', 'UTF-8'); // Инициализация DOMDocument $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // Заполнение структуры данными $xpath = new DOMXPath($dom); // Инициализация DOMXPath нашими данными $divs = $xpath->query('//div[@id="community_header" and @class="wcommunity_header"]'); // Запрос XPath foreach ($divs as $div) { $div->parentNode->removeChild($div); // Удаление найденных элементов } echo $dom->saveHTML(); См. демо этого кода. Запрос XPath означает: //div - найди все div, в которых [@id="community_header" - атрибутidравенcommunity_header` and - а также @class="wcommunity_header"] - атрибут class равен wcommunity_header.

Ответ 2



Не работает из-за того, что вот в этом месте \\< ^^^^ как и в других, потерялись перевод строки и пробельные символы. Следующая ошибка в жадном захвате: Скорее всего эта конструкция сожрёт всё до конца, так что так делать не надо. Как можно было бы попробовать: Все пробелы заменять на \s+ или \s*. Найти начало первого divа. Промотать в нём всё, что не связано с divами (?!]*)?>((?! получается ((?!]*)?>((?!)* Взять закрывывающий тег divа:
Целиком получается такая штука: ((?!]*)?>((?!)*
Чего-то, что прямо обязательно требовало бы экранирования нет. В php можно использовать любые ограничители для регулярных выражений, например #. В случае js надо экранировать слеши / и получится ((?!<\/?div\b)[\s\S]|]*)?>((?!<\/?div\b)[\s\S])*<\/div>)*<\/div> Попробуем (нужен браузер с поддержкой ES6): var pattern = /((?!<\/?div\b)[\s\S]|]*)?>((?!<\/?div\b)[\s\S])*<\/div>)*<\/div>/ig; console.log(`
Just a div
`.replace(pattern, "")); .as-console-wrapper.as-console-wrapper { top: 0; max-height: 100%; } Но вообще имеет смысл воспользоваться нормальным html-парсером.

Комментариев нет:

Отправить комментарий