Шаблоны регулярных выражений для обработки html-кода

Довольно часто бывает необходимо использовать RegExp-ы (система синтаксического разбора текстовых фрагментов по формализованному шаблону) для обработки html-кода страниц сайта.
В данной заметке я приведу наиболее востребованные из них, +краткий справочник метасимволов, +пример.

Наиболее востребованные шаблоны обработки html-кода

Картинки .GIF /<img[^>]+?gif.*?>/si
Аттрибут background /\s+background=[^\s>]*/si
Аттрибуты элементов HTML /\s+ATTRIBUTE=[^\s>]*/si
Комментарии HTML /<!— .*?—>/si
Дублирующиеся возвраты каретки /([\r\n])[\s]+/si
Неразрывные пространства /&(nbsp);/si
Двухдескрипторный тэг HTML, без содержимого /<TAGNAME.*?>(.*?)<\/TAGNAME.*?>/si 
Двухдескрипторный тэг HTML вместе с содержимым /<TAGNAME.*?>.*?<\/TAGNAME.*?>/si
Двухдескрипторный тэг HTML с определенным аттрибутом, без содержимого /<TAGNAME.*?ATTRIBUTE=["']*VALUE["']*.*?>(.*?)<\/TAGNAME.*?>/si
Двухдескрипторный тэг HTML с определенным аттрибутом вместе с содержимым /<TAGNAME.*?ATTRIBUTE=["']*VALUE["']*.*?>.*?<\/TAGNAME.*?>/si
Закрывающийся тэг HTML /<\/TAGNAME.*?>/si
Однодескрипторный или открывающий двухдескрипторный тэг HTML /<TAGNAME.*?>/si
Однодескрипторный или открывающий двухдескрипторный тэг HTML с определенным аттрибутом /<TAGNAME.*?ATTRIBUTE=["']*VALUE["']*.*?>/si
Ссылки на почтовые адреса без якоря /<a.*?href=["']*mailto.*?>(.*?)<\/a.*?>/si
Ссылки на почтовые адреса с якорем /<a.*?href=["']*mailto.*?>.*?<\/a.*?>/si

где:
метасимвол . — один любой символ;
квантификаторы:
* — ноль или более;
+ — одно или более;
? — Ноль или одно
[ ] — символьный класс, на данном месте в строке может стоять один из перечисленных символов
( ) — группировка, для определения для определения области действия и приоритета операций
модификаторы:
i — нечувствительность выражения к регистру символов (англ. case insensitivity);
s — режим соответствия точки символам переноса строки и возврата каретки (dot matches all).

Примеры
1. Вырезание модуля в joomla по условию.
1.1. Настройку $is_remove_module вынести в файл настроек модуля params.ini.
1.2. Пусть в переменной $body у нас содержится html-код страницы.
1.3. Тогда код:

if( $is_remove_module) {
   $body = preg_replace( '|<!--erase-->.*<!--erase-->|ism',  '', $body ); // вырезание модуля
}

вырежет модуль заключенный в комментарии .
Примечание: критично тут необходим модификатор «s», необходимый для многострочного поиска. Тестировать регексы онлайн можно на regexpal.com, локально в regexbuddy.
2. Пример с одного хорошего форума:
Как выпарсить полезную инфу (линк, якорь, цену) из кода:

<td class="il_main"><a href="/projects/131516.html" class="item">Модерация ссылок в каталоге.</a><div class="il_item_descr">Контент-менеджмент, Прочее | сегодня в 15:44</div></td>
<td class="il_small"><b class="amount_2">до 50 USD</b></td>

Решение:

$str = '<td class="il_main"><a href="/projects/131516.html" class="item">Модерация ссылок в каталоге.</a><div class="il_item_descr">Контент-менеджмент, Прочее | сегодня в 15:44</div></td>
<td class="il_small"><b class="amount_2">до 50 USD</b></td>';
 
preg_match_all('/href=\"(.+)\" class=\"item\">(.+)<\/a><div class=\"il_item_descr\">.+<\/div><\/td>\s+<td class=\"il_small\"><b class=\"amount_2\">(.+)<\/b><\/td>/siU', $str, $match);
 
print_r($match);

Функция print_r($match); выведет следующее:

Array
(
    [0] => Array
        (
            [0] => href="/projects/131516.html" class="item">Модерация ссылок в каталоге.
Контент-менеджмент, Прочее | сегодня в 15:44

до 50 USD
        )

    [1] => Array
        (
            [0] => /projects/131516.html
        )

    [2] => Array
        (
            [0] => Модерация ссылок в каталоге.
        )

    [3] => Array
        (
            [0] => до 50 USD
        )
)

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


Добавление комментария:

 css.php