Чтобы сопоставить буквальную обратную косую черту, многие люди и руководство по PHP говорят: «Всегда тройной побег», как этот \\\\
Примечание .
- Как я могу сопоставить арабские буквы, используя regexp в php
- проверка регулярного выражения даты php
- Как содержать только HTML-элементы
- получить id видео vimeo с regexp preg_match
- Регулярное выражение PHP - удаление всех не-буквенно-цифровых символов
Отдельные и двойные кавычки строк PHP имеют особое значение обратного слэша. Таким образом, если \ нужно сопоставить с регулярным выражением
\\
, то в PHP-коде необходимо использовать"\\\\"
или'\\\\'
.
Вот пример строки: \test
$test = "\\test"; // outputs \test; // WON'T WORK: pattern in double-quotes double-escaped backslash #echo preg_replace("~\\\t~", '', $test); #output -> \test // WORKS: pattern in double-quotes with triple-escaped backslash #echo preg_replace("~\\\\t~", '', $test); #output -> est // WORKS: pattern in single-quotes with double-escaped backslash #echo preg_replace('~\\\t~', '', $test); #output -> est // WORKS: pattern in double-quotes with double-escaped backslash inside a character class #echo preg_replace("~[\\\]t~", '', $test); #output -> est // WORKS: pattern in single-quotes with double-escaped backslash inside a character class #echo preg_replace('~[\\\]t~', '', $test); #output -> est
Вывод :
\\\
для соответствия литералу \ \\\
вне класса символов, он должен быть трехкратно экранирован \\\\
Кто может показать мне разницу, где двойная обратная косая черта в однокасканном шаблоне, например, '~\\\~'
будет соответствовать любому другому, чем тройной сбрасываемый обратный слэш в шаблоне с двойными кавычками, например "~\\\\~"
или сбой.
Когда / почему / в каком сценарии было бы неправильно использовать двойную экранированную \
в однокасканном шаблоне, например '~\\\~'
для сопоставления буквальной обратной косой черты?
Если ответа на этот вопрос нет, я бы всегда использовал двойную escape-обратную косую черту \\\
в шаблоне регулярных выражений с одним кавычком, чтобы соответствовать литералу \
потому что, возможно, нет ничего плохого в этом.
Символ обратной косой черты ( \
) считается escape-символом как парсером PHP, так и механизмом регулярных выражений (PCRE). Если вы пишете один символ обратной косой черты, он будет считаться escape-символом парсером PHP. Если вы напишете две обратные косые черты, это будет интерпретироваться как буквальная обратная косая черта парсером PHP. Но при использовании в регулярном выражении механизм регулярных выражений выбирает его как escape-символ. Чтобы этого избежать, вам нужно написать четыре символа обратной косой черты, в зависимости от того, как вы указываете шаблон.
Чтобы понять разницу между двумя типами шаблонов цитирования, рассмотрите следующие два var_dump()
:
var_dump('~\\\~'); var_dump("~\\\\~");
Вывод:
string(4) "~\\~" string(4) "~\\~"
Escape-последовательность \~
не имеет особого значения в PHP, когда она используется в одной кавычной строке. Три обратной косой черты также работают, потому что парсер PHP не знает об escape-последовательности \~
. Таким образом, \\
станет \
но \~
останется как \~
.
Какой из них следует использовать:
Для ясности, я всегда буду использовать ~\\\\~
когда хочу сопоставить буквальную обратную косую черту. Другой тоже работает, но я думаю, что ~\\\\~
более ясен.
Нет никакой разницы между фактическим экранированием косой черты в одиночных или двойных кавычках в PHP – до тех пор, пока вы это сделаете правильно. Причина, по которой вы получаете WONT WORK в своем первом примере, – это, как указано в комментариях, расширяет \ t до метасимвола tab.
Когда вы используете только три обратных слэша, последний в вашей одиночной кавычки будет интерпретироваться как \ ~, который по отношению к одиночным кавычкам будет оставлен как есть (поскольку он не соответствует допустимой escape-последовательности) , Однако просто совпадение заключается в том, что это будет анализироваться, как вы ожидаете в этом случае, и не иметь своего рода побочный эффект (т. Е. \\\ 'не будет вести себя одинаково).
Причиной всех побегов является то, что регулярному выражению также нужны обратные косые черты, сбежавшие в определенных ситуациях, так как они имеют особое значение там. Это приводит к большому числу обратных косых черт друг за другом, таких как \\\\ (что принимает восемь обратных косых черт для парсера уценки, так как оно еще раз добавляет еще один уровень экранирования).
Надеюсь, это очистит его, поскольку вы, кажется, сбиты с толку относительно обработки обратных косых черт в одиночных / двойных кавычках больше, чем поведение в самом регулярном выражении (которое будет одинаковым независимо от «или», если вы избежите вещей правильно).