PHP и обратные слеши в строках - PullRequest
5 голосов
/ 28 марта 2012

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

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

// false
var_dump('\\\\ ' === '\\ ');

// true
var_dump('\\\\ ' === '\\\ ');

Ответы [ 3 ]

8 голосов
/ 28 марта 2012

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

Для этого '\\ ' обозначает строку "\", '\\\\ ' обозначает строку"\\", так же как '\\\ '.Попробуйте:

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

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

4 голосов
/ 28 марта 2012

В строках, заключенных в одинарные кавычки, никакие 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

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

1 голос
/ 28 марта 2012

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

"\ " 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) "\\ "
}

Все двойные косые черты '\\' были преобразованы в одиночные косые черты '\', а косые черты остаются неизменными Экранирование работает одинаково в одинарных и двойных кавычках.

...