Именованные подшаблоны в регулярных выражениях

15.11.2017

Теги: PHPRegExpWeb-разработкаШаблон

С некоторых пор в 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 символов.

С версии PHP 5.2.2 для создания именованных подшаблонов допускается альтернативный синтаксис — (?<имя>) и (?'имя') наряду с (?P<имя>), а для обратных ссылок — \k<имя> и \k'имя' наряду с (?P=имя).

Поиск: PHP • RegExp • Web-разработка • Шаблон • PCRE • Карман • Регулярные выражения • Pattern • RegularExpressions

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.