В шаблоне регулярного выражения PHP требуется дополнительная обратная косая черта
Вопрос
При проверке ответа на вопрос другого пользователя Я нашел кое-что, чего не понимаю.Проблема заключалась в том, чтобы заменить все буквальные \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);
Должен сделать свое дело