2010-03-07 35 views
19
if(strpos("http://www.example.com","http://www.")==0){ // do work} 

Tôi hy vọng điều này sẽ giải quyết là đúng sự thật. Nhưng những gì xảy ra khi tôi làmphp 5 strpos() sự khác biệt giữa trả về 0 và sai?

if(strpos("abcdefghijklmnop","http://www.")==0){// do work} 

này cũng đi trên php 5 vì như xa như tôi có thể làm việc ra các strpos trả về false có thể dịch là 0.

là đúng suy nghĩ/hành vi này? Nếu vậy giải pháp thay thế cho thử nghiệm cho rằng chuỗi con là ở đầu chuỗi khác là gì?

Trả lời

39

Vâng, điều này là đúng/hành vi mong đợi:

  • strpos có thể trở lại 0 khi có một trận đấu vào lúc bắt đầu của chuỗi
  • và nó sẽ trả về false khi không có kết quả phù hợp

Điều bạn không nên sử dụng == để so sánh 0false; bạn nên sử dụng ===, như thế này:

if(strpos("abcdefghijklmnop","http://www.") === 0) { 

} 

Hoặc:

if(strpos("abcdefghijklmnop","http://www.") === false) { 

} 


Để biết thêm thông tin, xem Comparison Operators:

  • $a == $b sẽ TRUE nếu $a bằng $b.
  • $a === $b sẽ là TRUE nếu $a bằng $bchúng cùng loại.

Và, trích dẫn the manual page of strpos:

Chức năng này có thể trở lại Boolean FALSE, nhưng cũng có thể trả về một giá trị không Boolean mà đánh giá để FALSE, chẳng hạn như 0 hoặc "".
Vui lòng đọc phần trên Booleans cho thông tin khác.
Sử dụng the === operator để kiểm tra giá trị trả lại của chức năng này.

9

===!== so sánh kiểu giá trị:

if (strpos("abcdefghijklmnop", "http://www.") !== false){// do work} 
4

strpos trả về giá trị int hoặc boolean false. toán tử == cũng đánh giá 0 có nghĩa là sai, bạn muốn sử dụng toán tử === (ba bằng dấu) cũng kiểm tra xem các kiểu được so sánh có giống nhau hay không chỉ nhìn thấy nếu chúng có thể được đánh giá là giống nhau.

nên

if (strpos($hastack, $needle) === 0) 
{ 
    // the $needle is found at position 0 in the $haystack 
} 
1

0 là một giá trị trả về có thể từ strpos khi nó tìm thấy một trận đấu ở đầu. Trong trường hợp nếu không tìm thấy, nó trả về false (boolean). Vì vậy, bạn cần kiểm tra giá trị trả lại của strpos bằng cách sử dụng toán tử === kiểm tra giá trị và loại thay vì sử dụng == chỉ kiểm tra giá trị.

0

Cá nhân tôi có xu hướng sử dụng theo cách này:

if(!strpos($v,'ttp:'))$v='http://'.$v; 

hoặc

if(strpos(' '.$v,'http')) 

để tránh những "0" vị trí sau đó luôn luôn làm cho nó một số hơn 0 cổ vũ

+1

Nếu bạn mã sử dụng các cách phi tiêu chuẩn trong ký hiệu phi tiêu chuẩn để khắc phục các vấn đề tiêu chuẩn mà tất cả khả năng bảo trì đã rời khỏi tòa nhà. Mỗi nhà phát triển PHP khá biết và mong đợi ký hiệu '===' - câu trả lời của bạn chỉ trình bày một hiệu suất lỗi thời và kẻ giết người dễ đọc. –

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