2012-03-28 51 views
5

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('\\\\ ' === '\\\ '); 
+2

Bạn đã thử in các chuỗi chưa? – JJJ

+1

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 ở đó. –

+2

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

Trả lời

8

\ 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.

+0

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ó. –

+0

@ 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

+0

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,} # –

1

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.

4

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ó.

+0

+1 lời giải thích hay, dễ đọc ... – ManseUK

Các vấn đề liên quan