2015-11-25 22 views
6

Tôi cố gắng để phù hợp 008/Preg trận dấu gạch chéo

preg_match('/008\\//i', '008/', $matches); 
preg_match('/008\//i', '008/', $matches); 

Câu hỏi của tôi là tại sao cả hai biểu thức thông thường làm việc. Tôi sẽ mong đợi thứ hai để làm việc, nhưng tại sao đôi backslash một hoạt động?

+0

Ví dụ trong câu hỏi của bạn đang cố gắng đối sánh dấu gạch chéo, chứ không phải dấu gạch chéo ngược. – Barmar

+0

Chỉ trong trường hợp bạn không biết, ký tự '/' là dấu phân cách hoàn toàn tùy ý. Khi tôi tìm kiếm những thứ có chứa dấu gạch chéo, tôi sẽ thường làm một cái gì đó như 'preg_match ('# 008/#', $ string, $ matches)' để tôi có thể tránh việc thoát. – miken32

Trả lời

5

Bởi vì \\ trong chuỗi PHP có nghĩa là "thoát khỏi dấu gạch chéo ngược". Kể từ \/ không có nghĩa là bất cứ điều gì nó không cần phải được thoát (mặc dù nó có thể), vì vậy họ đánh giá như nhau.

Nói cách khác, cả hai sẽ in cùng một điều:

echo '/008\\//i'; // prints /008\//i 
echo '/008\//i'; // prints /008\//i 

Các dấu chéo ngược là one of the few characters that can get escaped in a single quoted string (ngoài rõ ràng \'), đảm bảo rằng bạn có thể làm cho một chuỗi như 'test\\' mà không thoát cuối cùng Trích dẫn.

+0

Dấu gạch chéo chuyển tiếp cần phải được thoát trong một biểu thức chính quy được giới hạn bởi '/'. Bạn đúng trong đó kết quả cuối cùng là như nhau, và đó là chuỗi này được chuyển đến mã PCRE. – miken32

+0

Vâng, tôi có nghĩa là vì ''\ /'' không đánh giá bất cứ điều gì đặc biệt, nó có tác dụng tương tự như ''\\ /''. Rõ ràng regex đặc biệt này yêu cầu dấu gạch chéo chuyển tiếp để được thoát, và cả hai ví dụ làm điều đó, đó là lý do tại sao cả hai công việc (chúng đều giống nhau). –

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