При тестировании ответа на вопрос другого пользователя я нашел что-то, что я не понимаю. Проблема состояла в том, чтобы заменить весь литерал \t
\n
\r
символы от строки с одиночным пробелом.
Теперь, первый шаблон, который я попробовал, был:
/(?:\\[trn])+/
который удивительно не работал. Я попробовал тот же шаблон в Perl, и он хорошо работал. После некоторого метода проб и ошибок я нашел, что PHP хочет, чтобы 3 или 4 обратных косых черты для того шаблона соответствовали, как в:
/(?:\\\\[trn])+/
или
/(?:\\\[trn])+/
эти шаблоны - к моему удивлению - обе работы. Почему эти дополнительные обратные косые черты необходимы?
Вам нужно 4 обратных косых черты для представления 1 в регулярном выражении, потому что:
"\\\\ "-> \\
) \\ -> \
) Из документа PHP,
экранирование любого другого символа приведет к тому, что обратная косая черта тоже будет напечатана 1
Следовательно, для \\\ [
,
\
, одна остается, потому что \ [
недействителен ( "\\\ [" -> \\ [
) \\ [-> \ [
) Да, это работает, но не рекомендуется.
Регулярное выражение всего / (?: \\ [TRN]) + /
. Но поскольку, поскольку вам нужно избежать обратных чехлов в струнных декларациях, каждая обратная косания должна быть выражена с помощью \\
:
"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'
всего три заднего пространства также работают, потому что PHP не знает escape Sequence \ [
и игнорирует его. Так \\
станет \
, но \ [
будет оставаться \ [
.
Это работает в Perl, потому что вы проходите это напрямую как рисунок Regex / (?: \\ [TRN]) + /
, но в PHP вам нужно пройти как строку, поэтому нужно дополнительное убежище для обратной косой сам.
"/(?:\\\\[trn])+/"
Regex \ Чтобы соответствовать одному Backslash станет «/ \\\ /» как Строка PHP PREG
Используйте str_replace!
$code = str_replace(array("\t","\n","\r"),'',$code);
должен сделать трюк