В шаблоне регулярных выражений PHP требуется дополнительная обратная косая черта - PullRequest
7 голосов
/ 27 января 2010

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

Итак, первый шаблон, который я попробовал, был:

/(?:\\[trn])+/

, что на удивление не сработало. Я попробовал тот же шаблон в Perl, и он работал нормально. После некоторых проб и ошибок я обнаружил, что PHP хочет 3 или 4 обратной косой черты для совпадения этого шаблона, как в:

/(?:\\\\[trn])+/

или

/(?:\\\[trn])+/

эти паттерны - к моему удивлению - оба работают. Зачем нужны эти дополнительные обратные слеши?

Ответы [ 4 ]

12 голосов
/ 27 января 2010

Вам нужно 4 обратной косой черты, чтобы представить 1 в регулярном выражении, потому что:

  • 2 обратные косые черты используются для разворачивания строки ("\\\\" -> \\)
  • 1 обратная косая черта используется для удаления в движке регулярных выражений (\\ -> \)

Из документа PHP,

экранирование любого другого символа также приведет к печати обратной косой черты 1

Следовательно для \\\[,

  • 1 обратная косая черта используется для удаления \, одно пребывание, потому что \[ недопустимо ("\\\[" -> \\[)
  • 1 обратная косая черта используется для удаления в движке регулярных выражений (\\[ -> \[)

Да, это работает, но не очень хорошая практика.

8 голосов
/ 27 января 2010

Это работает в Perl, потому что вы передаете это непосредственно как шаблон регулярного выражения /(?:\\[trn])+/

но в php вам нужно передать как string, так что для самой обратной косой черты нужно дополнительное экранирование.

"/(?:\\\\[trn])+/"

регулярное выражение \, чтобы соответствовать один обратная косая черта станет '/ \\\\ /' как PHP preg string

2 голосов
/ 27 января 2010

Регулярное выражение равно просто /(?:\\[trn])+/. Но поскольку вам также необходимо избегать обратной косой черты в строковых объявлениях, каждая обратная косая черта должна быть выражена с помощью \\:

"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'

Работают только три возврата, потому что PHP не знает escape-последовательность \[ и игнорирует ее. Таким образом, \\ станет \, а \[ останется \[.

0 голосов
/ 27 января 2010

Используйте str_replace!

$code = str_replace(array("\t","\n","\r"),'',$code);

Нужно сделать трюк

...