Шаблоны регулярных выражений для обработки html-кода
В наше время развитя сайто строения сложно найти скрип или систему в которой не использвоалсь регулярные выражения, не будим рассматривать граберы сайтов тут и коту понятно, а если допустим мы продвинулись и поняли что стандартные модули joomla очень неопвортливы и решили написать свой. Допустим пишим вывод новостей, закладываем функцию поиска фотографии в статье и нарезаем превьюшку, в этой задаче не обойтись без регулярного выражения ищущего img в нашей статье.
Итак довольно часто бывает необходимо использовать 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 ) )
Шаблоны регулярных выражений для обработки html-кода - Генератор расширений Joomla и многое другое на нашем сайте посвященном работе расширений, компонентов, модулей, плагинов для линейки Joomla. Отправляйте ссылку на страницу своим друзьям и в социальные сети воспользовавшись графическими иконками выше.