Дополнительная обратная косая черта, необходимая в PHP regexp шаблон

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

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

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

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

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

или

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

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

7
задан Community 23 May 2017 в 11:59
поделиться

4 ответа

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

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

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

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

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

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

Да, это работает, но не рекомендуется.

12
ответ дан 6 December 2019 в 09:19
поделиться

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

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

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

2
ответ дан 6 December 2019 в 09:19
поделиться

Это работает в Perl, потому что вы проходите это напрямую как рисунок Regex / (?: \\ [TRN]) + /

, но в PHP вам нужно пройти как строку, поэтому нужно дополнительное убежище для обратной косой сам.

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

Regex \ Чтобы соответствовать одному Backslash станет «/ \\\ /» как Строка PHP PREG

8
ответ дан 6 December 2019 в 09:19
поделиться

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

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

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

-2
ответ дан 6 December 2019 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: