PHP 8.3.4 Released!

Разделители

При работе с функциями модуля 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://#
Функцией preg_quote() пользуются, чтобы экранировать строку в шаблоне, а необязательный второй параметр функции разрешает задать разделитель.

После закрывающего разделителя указывают модификаторы шаблонов. Следующий пример показывает сопоставление без учёта регистра:

#[a-z]#i

add a note

User Contributed Notes 3 notes

up
36
Pedro Gimeno
9 years ago
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
?>
up
12
Munin
8 years ago
preg_match('{[}]}', ''); // Warning: preg_match(): Unknown modifier ']'

preg_match('{[\}]}', ''); // OK
up
4
Revo
5 years ago
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.
To Top