В шаблоне регулярного выражения PHP требуется дополнительная обратная косая черта

StackOverflow https://stackoverflow.com/questions/2145804

  •  23-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

или

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

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

Regex , чтобы соответствовать одному обратному сбору, станет '//' как Строка предварительной подготовки PHP

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

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

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

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

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

Должен сделать свое дело

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top