Именованные подшаблоны в регулярных выражениях
15.11.2017
Теги: PHP • RegExp • Web-разработка • Шаблон
С некоторых пор в PCRE появилась возможность давать имена подшаблонам, что позволяет повысить удобочитаемость программного кода. Пусть имеется строка с HTML-тегом ссылки, и требуется получить отдельные части — адрес ссылки и текст ссылки.
$string = '<a href="http://server.com">Текст ссылки</a>'; $pattern = '~<a href="([^"]+)">(.*?)</a>~'; preg_match($pattern, $string, $matches); print_r($matches);
Array ( [0] => <a href="http://server.com">Текст ссылки</a> [1] => http://server.com [2] => Текст ссылки )
Искомые подстроки находятся в $matches[1]
и $matches[2]
.
А теперь изменим шаблон так, чтобы назначение некоторых его частей стало более понятным. Воспользуемся для этого специальными конструкциями вида (?P<имя>)
:
$string = '<a href="http://server.com">Текст ссылки</a>'; $pattern = '~<a href="(?P<url>[^"]+)">(?P<text>.*?)</a>~'; preg_match($pattern, $string, $matches); print_r($matches);
Array ( [0] => <a href="http://server.com">Текст ссылки</a> [url] => http://server.com [1] => http://server.com [text] => Текст ссылки [2] => Текст ссылки )
В массив с совпавшими подстроками добавились элементы со строковыми индексами, соответствующими названиями подшаблонов. Теперь к нужным строкам можно обращаться по именам, а не только по числовым индексам: $matches['url']
и $matches['text']
.
Имена подшаблонов могут использоваться для обратных ссылок:
$string = '<a href="http://server.com">Текст ссылки</a>'; $pattern = '~<a href=(?P<quote>"|\')(?P<url>[^"\']+)(?P=quote)>(?P<text>.*?)</a>~'; preg_match($pattern, $string, $matches); print_r($matches);
Array ( [0] => <a href="http://server.com">Текст ссылки</a> [quote] => " [1] => " [url] => http://server.com [2] => http://server.com [text] => Текст ссылки [3] => Текст ссылки )
Имена подшаблонов могут содержать латинские буквы, цифры и знак подчеркивания и не должны быть длиннее 32 символов.
(?<имя>)
и (?'имя')
наряду с (?P<имя>)
, а для обратных ссылок — \k<имя>
и \k'имя'
наряду с (?P=имя)
.
- Битрикс. Система обработки адресов
- Модуль mod_rewrite сервера Apache
- Блог на Laravel 7, часть 17. Временная зона для пользователей, деплой на хостинг TimeWeb
- Блог на Laravel 7, часть 16. Роль нового пользователя, сообщение админу о новом посте
- Блог на Laravel 7, часть 15. Восстановление постов, slug для категории, поста и страницы
- Блог на Laravel 7, часть 14. Валидация данных и права доступа при загрузке изображений
- Блог на Laravel 7, часть 13. Загрузка и ресайз изображений для категорий и постов блога
Поиск: PHP • RegExp • Web-разработка • Шаблон • PCRE • Карман • Регулярные выражения • Pattern • RegularExpressions