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