php[tek] 2018 : Call for Speakers

Метасимволы

Сила регулярных выражений исходит из возможности использовать условия и повторения в шаблоне. Они записываются при помощи метасимволов, которые специальным образом интерпретируются.

Существуют два различных набора метасимволов: те, которые используются внутри квадратных скобок, и те, которые используются вне квадратных скобок. Вне квадратных скобок используются следующие метасимволы:

Метасимволы вне квадратных скобок
МетасимволОписание
\общий экранирующий символ, допускающий несколько вариантов применения
^декларирует начало данных (или строки в многострочном режиме)
$декларирует конец данных или до завершения строки (или окончание строки в многострочном режиме)
.соответствует любому символу, кроме перевода строки (по умолчанию)
[начало описания символьного класса
]конец описания символьного класса
|начало ветки условного выбора
(начало подмаски
)конец подмаски
?расширяет смысл метасимвола (, является также квантификатором, означающим 0 или 1 вхождение, также преобразует жадные квантификаторы в ленивые (смотрите повторение))
*квантификатор, означающий 0 или более вхождений
+квантификатор, означающий 1 или более вхождений
{начало количественного квантификатора
}конец количественного квантификатора
Часть шаблона, заключенная в квадратные скобки называется символьным классом. В символьном классе используются следующие метасимволы:
Метасимволы внутри квадратных скобок (символьном классе)
МетасимволОписание
\общий экранирующий символ
^означает отрицание класса, допустим только в начале класса
-означает символьный интервал
Следующие разделы детально описывают каждый из перечисленных метасимволов.

add a note add a note

User Contributed Notes 2 notes

up
1
Kurt Wei
1 year ago
disturbing usage of "any character" for multi-lines...

remark:
'.' (all characters) just does NOT include on single character the newline (\n) by default,
while \n is included in all other matching searches (e.g. \s).
Funny enough, the "carriage return" (\r) is included, when using '.'

You have to write "(.|\\n)" instead of a single dot, with disadvantages in using complex matching-results,

or simple use the "s" modificator to bring dot to accept the newline.

$subject="<tag>Hello\nWorld</tag>";

preg_match( '/<tag>[A-Za-z\\s]*<\\/tag>/' , $subject ); //true
preg_match( '/<tag>[^<]*<\\/tag>/' , $subject ); //true
preg_match( '/<tag>(.|\\n)*<\\/tag>/' , $subject ); //true
preg_match( '/<tag>.*<\\/tag>/s' , $subject ); //true
preg_match( '/<tag>.*<\\/tag>/' , $subject ); //ATTENTION! *false*
up
-17
Thomas
2 years ago
The meta character $ accepts a (one) newline character (\n).

(Take a moment to let this information sink in)

You might want to (r)trim() your input afterwards if you have a match because otherwise it (still) might not meet a length requirement or other strange stuff might happen when you store the input as-is.
To Top