2013-02-17 4 views
1

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

preg_replace("/[^a-zA-Z0-9.?!\s]/", "", $mystring); 

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

ответ

5

Вы не указали образец $mystring, который был бы полезен.

Как написано, это регулярное выражение заменяет один и только один символ в $mystring. В частности, ваш характерный класс включает персонаж карата (^) в самом начале. В любом Perl-совместимом движке регулярных выражений (из которого PHP один) это указывает не на эти вещи (см. character classes для получения дополнительной информации). Таким образом, ваше выражение, по существу, зачистки все, что не:

  • строчной буквы между а и г
  • прописной буквы между А и Z
  • Цифра от 0 до 9
  • периода
  • Вопросительный знак
  • восклицательный знак
  • пробелами символов

Символ черты не один из указанных выше, поэтому он подбирается и заменяется.

Ваше предположение о «сквозной» тире черт, поскольку вы написали это, верно. Символ тире - это один из 4 специальных символов в классе символов, и он используется для обозначения диапазона символов.

+0

Благодарим вас за прекрасное объяснение. :) – osakagreg

Смежные вопросы