Именованные подшаблоны в регулярных выражениях
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