2012-12-17 28 views
6

Có: tôi biết. Chúng ta nên sử dụng hàm mb_ ​​* khi chúng ta đang làm việc với char multibyte. Nhưng khi chúng ta sử dụng strpos? Chúng ta hãy xem xét mã này (lưu trong utf-8)mb_strpos vs strpos, sự khác biệt là gì?

var_dump(strpos("My symbol utf-8 is the €.", "\xE2\x82\xAC")); // int(23) 

Có sự khác biệt của việc sử dụng mb_strpos? Không làm cho công việc này có cùng công việc không? Sau cùng, does't strpos tìm kiếm một chuỗi (nhiều byte)? Có một lý do để sử dụng thay vì strpos?

+1

này có thể giúp :: http://stackoverflow.com/questions/ 5712226/khi-nên-i-sử dụng-mb-strpos-over-strpos –

Trả lời

11

Đối với UTF-8, khớp với chuỗi byte hoàn toàn giống với chuỗi ký tự trùng khớp.

Vì vậy, cả hai đều sẽ tìm thấy những cây kim ở chính xác cùng một điểm, nhưng mb_strpos đếm đầy đủ UTF-8 byte sequencees trước kim, nơi như strpos tính toán bất kỳ byte. Vì vậy, nếu chuỗi bạn đã có một đa-byte UTF-8 chuỗi, kết quả sẽ khác nhau:

strpos("My symbolö utf-8 is the €.", "€") !== mb_strpos("My symbolö utf-8 is the €.", "€", 0, "UTF-8") 

Nhưng:

strpos("My symbol utf-8 is the €.", "€") === mb_strpos("My symbol utf-8 is the €.", "€", 0, "UTF-8") 
5

Tùy thuộc vào ký tự được sử dụng và chuỗi đang được tìm kiếm, điều này có thể hoặc không thể tạo sự khác biệt.

strpos() tìm chuỗi byte được chuyển làm kim.

mb_strpos() làm điều tương tự nhưng nó cũng tôn trọng ranh giới ký tự.

Vì vậy, strpos() sẽ khớp nếu chuỗi byte xảy ra ở bất kỳ đâu trong chuỗi. mb_strpos() sẽ chỉ khớp nếu chuỗi byte cũng đại diện cho một tập hợp các ký tự hoàn chỉnh hợp lệ.

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