Разделители
При использовании любой PCRE функции необходимо заключать шаблон в разделители. Разделителем может быть любой символ не являющийся буквой, цифрой, обратной косой чертой или каким-либо пробельным символом.
Часто используемыми разделителями являются косые черты (/), знаки решетки (#) и тильды (~). Ниже представлены примеры шаблонов с корректными разделителями.
/foo bar/ #^[^0-9]$# +php+ %[a-zA-Z0-9_-]%
Также можно использовать разделитель в виде скобок, где стартовый и завершающий разделители являются соответственно открывающей и закрывающей скобками. (), {}, [] и <> являются допустимыми парами разделителей.
(this [is] a (pattern)) {this [is] a (pattern)} [this [is] a (pattern)] <this [is] a (pattern)>
Если необходимо использовать разделитель внутри шаблона, его нужно проэкранировать с помощью обратной косой черты. Если разделитель часто используется в шаблоне, в целях удобочитаемости, лучше выбрать другой разделитель для этого шаблона.
/http:\/\// #http://#
После закрывающего разделителями можно использовать модификаторы шаблонов. Ниже следуюет пример регистро-независимого поиска:
#[a-z]#i
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Обработка текста
- Функции для работы с регулярными выражениями (Perl-совместимые)
- Регулярные выражения PCRE
- Вступление
- Разделители
- Метасимволы
- Экранирующие последовательности
- Свойства Unicode-символов
- Якоря
- Метасимвол точка
- Символьные классы
- Альтернативный выбор
- Установка внутренних опций
- Подмаски
- Повторение
- Обратные ссылки
- Утверждения
- Однократные подмаски
- Условные подмаски
- Комментарии
- Рекурсивные шаблоны
- Производительность
Коментарии
Note that bracket style opening and closing delimiters aren't a 100% problem-free solution, as they need to be escaped when they aren't in matching pairs within the expression. That mismatch can happen when they appear inside character classes [...], as most meta-characters lose their special meaning. Consider these examples:
<?php
preg_match('{[{]}', ''); // Warning: preg_match(): No ending matching delimiter '}'
preg_match('{[}]}', ''); // Warning: preg_match(): Unknown modifier ']'
preg_match('{[}{]}', ''); // Warning: preg_match(): Unknown modifier ']'
?>
Escaping them solves it:
<?php
preg_match('{[\{]}', ''); // OK
preg_match('{[}]}', ''); // OK
preg_match('{[\}\{]}', ''); // OK
?>
preg_match('{[}]}', ''); // Warning: preg_match(): Unknown modifier ']'
preg_match('{[\}]}', ''); // OK
Note that angle brackets `<>` shouldn't be used as delimiters whenever you will have to invoke advanced clusters like atomic groups or lookbehinds because their including angle bracket doesn't come in pair and escaping doesn't help either.