PHP и обратные косые черты в строках

Может ли кто-нибудь сказать мне, что здесь происходит?

<?php // true var_dump('\\ ' === '\ '); // false var_dump('\\\\ ' === '\\ '); // true var_dump('\\\\ ' === '\\\ '); 

\ внутри строкового литерала вводит несколько типов escape-последовательностей, \\ – escape-последовательность для литерала "\". Но \ s, которые не разрешают escape-последовательность, также берутся как буква "\".

Поэтому '\\ ' обозначает строку «\», '\\\\ ' обозначает строку «\\», как '\\\ ' . Пытаться:

 echo '\\\\ '; -> \\ 

См. http://php.net/manual/en/language.types.string.php#language.types.string.syntax.single .

В строках с одиночными кавычками никакие escape-последовательности не интерполируются. Обратная косая черта – это только escape-символ, если он сразу предшествует одиночной кавычке или обратную косую черту .

Так:

 var_dump('\\ '); // String (2) "\ " var_dump('\ '); // String (2) "\ " // They do match var_dump('\\\\ '); // String (3) "\\ " var_dump('\\ '); // String (2) "\ " // They don't match var_dump('\\\\ '); // String (3) "\\ " var_dump('\\\ '); // String (3) "\\ " // They do match 

Это ожидаемое и задокументированное поведение, хотя может быть сложно обернуть вокруг себя.

В первом примере вы сравниваете

 "\ " and "\ " which is TRUE 

в 2-м

 "\\ " and "\ " which is FALSE 

в 3-м

 "\\ " and "\\ " which is TRUE 

Если вы распечатываете свои строки

 $s = array('\ ', '\\ ', '\\\ ', '\\\\ '); var_dump($s); 

ты получишь

 array(4) { [0]=> string(2) "\ " [1]=> string(2) "\ " [2]=> string(3) "\\ " [3]=> string(3) "\\ " } 

Все двойные косые черты '\\' были преобразованы в однократные черты '\' а sigle-slashes остаются прежними. Экранирование работает одинаково в одиночных и двухцилиндренных строках.