Có ai có thể cho tôi biết điều gì đang xảy ra ở đây không?PHP và dấu gạch chéo ngược trong chuỗi
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
Có ai có thể cho tôi biết điều gì đang xảy ra ở đây không?PHP và dấu gạch chéo ngược trong chuỗi
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
\
bên trong một chuỗi chữ giới thiệu một số loại chuỗi escape, \\
là dãy thoát cho một chữ "\". Nhưng, \
s không giải quyết được chuỗi thoát cũng được xem là chữ "\".
Do đó, '\\ '
là viết tắt của chuỗi "\", '\\\\ '
là viết tắt của chuỗi "\\", giống như '\\\ '
. Thử:
echo '\\\\ '; -> \\
Xem http://php.net/manual/en/language.types.string.php#language.types.string.syntax.single.
Tôi không có ý tưởng rằng \\ hoạt động trong một chuỗi đơn trích dẫn, nghĩ rằng nó chỉ hoạt động trên chính nó. –
@ DaliborKarlović Nó được thiết lập như vậy, do đó bạn có thể có một chuỗi trích dẫn duy nhất kết thúc bằng dấu gạch chéo ngược, nếu bạn không thể thoát khỏi dấu gạch chéo ngược, bạn sẽ không thể quấn 'chuỗi \' trong dấu nháy đơn. – DaveRandom
Vâng, tôi nhận được nó, xấu của tôi là tôi đã cố gắng sử dụng nó bên trong một regex tìm kiếm một chữ \ n (không phải là một char kiểm soát), vì vậy preg_quote ('# \ n #') sản xuất một chuỗi phù hợp, nhưng var_dump() - ing giá trị được tạo ra bởi preg_quote() và sử dụng giá trị đó thay vì không. Bây giờ tôi đã phải sử dụng # (\\\ n) {2,} # –
Trong ví dụ 1 bạn đang so sánh
"\ " and "\ " which is TRUE
trong 2
"\\ " and "\ " which is FALSE
trong 3
"\\ " and "\\ " which is TRUE
Nếu bạn in ra chuỗi của bạn
$s = array('\ ', '\\ ', '\\\ ', '\\\\ ');
var_dump($s);
bạn sẽ nhận được
array(4) {
[0]=>
string(2) "\ "
[1]=>
string(2) "\ "
[2]=>
string(3) "\\ "
[3]=>
string(3) "\\ "
}
Tất cả đôi slashes '\\'
đã được chuyển đổi thành đơn slashes '\'
và sigle-slashes vẫn như cũ. Thoát hoạt động theo cách tương tự bên trong các chuỗi đơn và được trích dẫn kép.
Trong các chuỗi được trích dẫn đơn lẻ, không có chuỗi thoát nào được nội suy. Dấu gạch chéo ngược chỉ là ký tự thoát nếu nó ngay trước dấu nháy đơn, hoặc dấu gạch chéo ngược.
Vì vậy:
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
này được dự kiến và ghi nhận hành vi, mặc dù nó có thể được khó khăn để quấn bạn đi xung quanh trên mặt của nó.
+1 lời giải thích hay, dễ đọc ... – ManseUK
Bạn đã thử in các chuỗi chưa? – JJJ
Vâng, đã hủy các mã hex. Họ thực sự khác nhau, có vẻ như là một \ bị sụp đổ để \ vì lý do nào đó, nhưng nó trong một chuỗi trích dẫn duy nhất, nó không nên xảy ra ở đó. –
Không có sự khác biệt nào cho dù một chuỗi được trích dẫn đơn hay kép. Ký tự thoát hoạt động giống nhau trong cả hai trường hợp. – JJJ