Intereting Posts
Является ли это безопасным использованием переменных сеанса? Регулярное выражение PHP для проверки английского имени Как вызвать макет по умолчанию в ZF2 для всех модулей или выбранных модулей? Вернуть первый ключ ассоциативного массива в PHP Как автоматически преобразовать URL-адрес в гипер ссылку в PHP? Найдите массив и верните все ключи и значения, если найдено совпадение PHPUnit из командной строки – список отображаемых файлов зависимостей. Как я могу отобразить только тестовый скрипт? $ _COOKIE , похоже, не отражает изменений после установки ASP.NET для WordPress SSO с HttpWebRequest Обнаружение того, находится ли пользователь за прокси-сервером Как очистить память после того, как file_get_contents выполняется в php Объект Cant Post JSON с использованием Jquery.post () Как я могу отобразить значение div с нажатием кнопки? GeoLocation API Получите количество просмотров для продукта magento на основе product_id

Как правильно избежать обратного слэша, чтобы соответствовать буквальной обратной косой чертой в шаблонах регулярных выражений с одним кавычком и двойным кавычком

Чтобы сопоставить буквальную обратную косую черту, многие люди и руководство по 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-последовательности) , Однако просто совпадение заключается в том, что это будет анализироваться, как вы ожидаете в этом случае, и не иметь своего рода побочный эффект (т. Е. \\\ 'не будет вести себя одинаково).

Причиной всех побегов является то, что регулярному выражению также нужны обратные косые черты, сбежавшие в определенных ситуациях, так как они имеют особое значение там. Это приводит к большому числу обратных косых черт друг за другом, таких как \\\\ (что принимает восемь обратных косых черт для парсера уценки, так как оно еще раз добавляет еще один уровень экранирования).

Надеюсь, это очистит его, поскольку вы, кажется, сбиты с толку относительно обработки обратных косых черт в одиночных / двойных кавычках больше, чем поведение в самом регулярном выражении (которое будет одинаковым независимо от «или», если вы избежите вещей правильно).