webew
Войти » Регистрация
 
PHP

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

10 марта 2011, 9:36

С некоторых пор1 в PCRE появилась возможность давать имена подшаблонам2, что позволяет повысить удобочитаемость программного кода.

Рассмотрим пример: пусть имеется строка с HTML-тегом <a>, для которого требуется получить отдельные части - адрес назначения и текст ссылки.

<?php
$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<имя>):

<?php
$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:

<?php
$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. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
Добавить комментарий
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100