Почему нам нужно избегать! <>: = - в регулярных выражениях php?
http://php.net/manual/en/function.preg-quote.php:
Специальные символы регулярного выражения:.\+ *? [^] $() { знак равно < > |: -
Однако эта страница говорит, что специальные символы [ \ ^ $ . | ? * + ( )
Хорошо. Я знаю, что первая страница специально предназначена для регулярных выражений php. Однако почему нам нужно избежать !
, <
, >
, :
, =
, -
?
Я попытался сделать preg_match
без экранирования <
, >
, -
и !
, и все работает отлично.
Ответы
Ответ 1
Эти символы являются метасимволами, но им не требуется экранирование. Что общего у них, так это то, что они встречаются в специальных конструкциях группировки:
(?:...) # non-capturing group
(?=...) # positive lookahead
(?!...) # negative lookahead
(?<name>...) # named capturing groups
(?<=...) # positive lookbehind
(?<!...) # negative lookbehind
(?>...) # atomic group
Но в этом контексте они приобретают особое значение. Поэтому, если вы берете любую строку и избегаете всех этих символов: [\^$.|?*+(){
, вы получите регулярное выражение, которое будет точно соответствовать символу строки символом, потому что эти другие метасимволы никогда не могут находиться в метаконтенте.
Например, ]
является только метасимволом, если существовал предыдущий unescaped [
, который открыл класс символов.
Аналогично, -
является только метасимволом в символьном классе, что означает "диапазон", как в [a-z]
(или буквальный -
, как в [abc-]
.
Итак, чтобы избежать строки [tag-soup]
, вам просто нужно избежать [
. Вне класса символов ]
и -
просто рассматриваются как литералы.
Итак, если вы берете строку и избегаете всех "безусловных" метасимволов ([\^$.|?*+(){
), вы получаете регулярное выражение, которое будет точно соответствовать символу строки символом.
Ответ 2
Страница, на которую вы ссылаетесь, называется "базовый синтаксис regex". Существует ссылка на страницу под названием "расширенный синтаксис regex" . Здесь используются все дополнительные символы, которые вы указали.
-
!
используется для негативных обращений и lookbehinds
-
<
используется для lookbehinds
-
>
используется для атомных групп
-
:
используется для установки флагов только для раздела регулярного выражения
-
=
используется для позитивного просмотра и поиска.
-
-
используется для диапазонов символов и корректировки флагов
Ответ 3
Тире - специальный символ внутри классов символов:
[a-zA-Z0-9]
Другие имеют значение внутри групп соответствия, например для lookahead/lookbehind:
(?<=foo)
(?!bar)
Я согласен с вами в том, что ничто из этого не нужно избегать. Как только скобки и квадратные скобки экранированы, эти другие символы теряют свое особое значение.
Ответ 4
Эти символы используются в выражениях с отрицательным/положительным внешним выражением/впереди/вокруг. Например:
/^foo(?<!z)bar$/
Подробнее см. здесь.
Ответ 5
Многие символы являются специальными только в определенном контексте. Из основных, несколько примеров:
/-/ # dash
/[a-z]/ # range
/[-a-z]/ # a-z or dash
/[^]/ # literal
/^/ # meta-character
/!/ # literal
/(?!...)/ # meta-character