Именованные подшаблоны в регулярных выражениях
С некоторых пор1 в PCRE появилась возможность давать имена подшаблонам2, что позволяет повысить удобочитаемость программного кода.
Рассмотрим пример: пусть имеется строка с HTML-тегом <a>, для которого требуется получить отдельные части - адрес назначения и текст ссылки.
$string = '<a href="http://webew.ru">Webew: теория и практика веб-технологий</a>';
$pattern = '/<a href="([^"]+)">(.*?)<\/a>/';
preg_match($pattern, $string, $matches);
print_r($matches);
?>
Array ( [0] => <a href="http://webew.ru">Webew: теория и практика веб-технологий</a> [1] => http://webew.ru [2] => Webew: теория и практика веб-технологий )
Искомые подстроки находятся в $matches[1] и $matches[2].
А теперь изменим шаблон так, чтобы назначение некоторых его частей стало более понятным. Воспользуемся для этого специальными конструкциями вида (?P<имя>):
$string = '<a href="http://webew.ru">Webew: теория и практика веб-технологий</a>';
// $pattern = '/<a href="([^"]+)">(.*?)<\/a>/'; // старый вариант без имён для подшаблонов
$pattern = '/<a href="(?P<url>[^"]+)">(?P<text>.*?)<\/a>/';
preg_match($pattern, $string, $matches);
print_r($matches);
?>
Array ( [0] => <a href="http://webew.ru">Webew: теория и практика веб-технологий</a> [url] => http://webew.ru [1] => http://webew.ru [text] => Webew: теория и практика веб-технологий [2] => Webew: теория и практика веб-технологий )
В массив с совпавшими подстроками добавились элементы со строковыми индексами, соответствующими названиями подшаблонов. Теперь к нужным строкам можно обращаться по именам, а не только по числовым индексам: $matches['url'] и $matches['text'].
Имена подшаблонов могут использоваться для обратных ссылок3:
$string = 'Это я. Это снова я.';
$pattern = '/(?P<ya>я).*?(?P=ya)/'; // вариант без имён - /(я).*?\1/
preg_match($pattern, $string, $matches); print_r($matches);
?>
Array ( [0] => я. Это снова я [ya] => я [1] => я )
Имена подшаблонов могут содержать латинские буквы, цифры и знак подчеркивания и не должны быть длиннее 32 символов4.
С версии PHP 5.2.2 (PCRE 7.0) для создания именованных подшаблонов допускается альтернативный синтаксис - (?<имя>) и (?'имя') наряду с (?P<имя>), а для обратных ссылок - \k<имя> и \k'имя' наряду с (?P=имя) (с PHP 5.2.4 - также \k{имя} и \g{имя})5.
1. Возможность создания именованных подшаблонов (англ. named subpatterns) впервые появилась в PCRE 4.0.
2. Подшаблоном (англ. subpattern) называется его часть, заключенная в круглые скобки. Например, в шаблоне /(\w+)/ это (\w+). Подробнее см. соответсвующий раздел руководства по синтаксису шаблонов регулярных выражений в PHP.
3. англ. backreferencing. См., например, http://php.net/manual/en/regexp.reference.back-references.php.
4. http://regexkit.sourceforge.net/Documentation/pcre/pcrepattern.html#SEC14.
5. http://ru2.php.net/manual/en/regexp.reference.subpatterns.php.
© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.