Зачем нам убегать! <>: = - в php регулярные выражения? - PullRequest
10 голосов
/ 10 сентября 2011

http://php.net/manual/en/function.preg-quote.php:

Специальные символы регулярного выражения:. \ + *? [^] $ () { знак равно <> | : -

Однако эта страница говорит, что специальные символы [ \ ^ $ . | ? * + ( )

Хорошо, я знаю, что первая страница посвящена регулярным выражениям php. Однако, почему мы должны избегать !, <, >, :, =, -?

Я пытался сделать preg_match без экранирования <, >, - и !, и все работает отлично.

Ответы [ 5 ]

5 голосов
/ 10 сентября 2011

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

(?:...)      # non-capturing group
(?=...)      # positive lookahead
(?!...)      # negative lookahead
(?<name>...) # named capturing groups
(?<=...)     # positive lookbehind
(?<!...)     # negative lookbehind
(?>...)      # atomic group

Но в этом контексте они приобретают только особое значение.Поэтому, если вы берете любую строку и экранируете все эти символы: [\^$.|?*+(){, вы получаете регулярное выражение, которое будет точно соответствовать строке символ за символом, потому что эти другие метасимволы никогда не могут находиться в мета-контексте.

Например, ] является только метасимволом, если был предыдущий неэкранированный [, открывший класс символов.

Аналогично, - - это только метасимвол в классе символов, что означает «диапазон», как в [a-z] (или литерал -, как в [abc-].

Таким образом, для экранирования строки [tag-soup] вам просто нужно экранировать [. За пределами класса символов ] и - просто рассматриваются как литералы.

В итоге, если вы берете строку и экранируете все «безусловные» метасимволы ([\^$.|?*+(){), то вы получаете регулярное выражение, которое будет точно соответствовать строке символ за символом.

4 голосов
/ 10 сентября 2011

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

  • ! используется для отрицательных взглядов и взглядов
  • < используется для взглядов назад
  • > используется для атомных групп
  • : используется для установки флагов только для части регулярного выражения
  • = используется для положительных взглядов и взглядов
  • - используется для диапазонов символов и настройки флагов
3 голосов
/ 10 сентября 2011

Тире - это специальный символ внутри классов символов:

[a-zA-Z0-9]

Другие имеют значение в группах совпадений, например, для lookahead / lookbehind:

(?<=foo)
(?!bar)

Я согласен с вамичто ни один из них не должен быть спасен.После того, как скобки и квадратные скобки удалены, эти другие символы теряют свое особое значение.

1 голос
/ 10 сентября 2011

Многие символы являются особенными только в определенном контексте.Из базовых несколько примеров:

 /-/       # dash
 /[a-z]/   # range
 /[-a-z]/  # a-z or dash

 /[^]/     # literal
 /^/       # meta-character

 /!/       # literal
 /(?!...)/ # meta-character
1 голос
/ 10 сентября 2011

Эти символы используются в выражениях "отрицательный / положительный взгляд назад / вперед / вокруг".Например:

/^foo(?<!z)bar$/

См. здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...