Вопрос по php, pcre, regex – В шаблоне регулярных выражений PHP требуется дополнительная обратная косая черта

7

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

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

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

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

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

или же

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

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

Регулярные выражения Perl интегрированы в язык, поэтому вам нужно всего две обратные косые черты. Alexandr Ciornii

Ваш Ответ

4   ответа
8

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

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

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

Регулярное выражение \ для соответствия с одной обратной косой чертой станет '/ \\\\ /» какPHP preg строка

2

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

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

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

@kemp: Да, заменяются только escape-последовательности, перечисленные в руководстве. Gumbo
Gumbo :: просто так я знаю, правильно ли я понял - этот случай работает, потому что\[ ISN»управляющий персонажа также он не становится буквально открытой квадратной скобкой, потому что шаблон анализируется слева направо, поэтому обратная косая черта присоединяется к предыдущему и ранее экранируется? Matteo Riva
Тогда почему работают 3 обратных слеша? И почемуt одинарные кавычки в этом случае отличаются от двойных? Matteo Riva
@kemp: обновил мой ответ. Gumbo
-2

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

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

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

Нет вы можете't заменить - скажем - три (или любое произвольное число) из тех, которые с одним пробелом, если вы не хотите предоставитькаждый возможная комбинация. Ваш код просто удаляет их все. Matteo Riva
Это нене отвечает на мой вопрос, и это также неправильно, потому что str_replace () не• разрешить замену всех запрошенных символов (сколько бы их ни было) одинарной кавычкой - вы можете просто удалить их все. Matteo Riva
@kemp да, это так. Если это не такудалить как есть попробуйте комбинации \ r \ n или \ n \ r AntonioCS
12

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

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

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

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

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

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

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

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