Подтвердить что ты не робот

Php 5 strpos() разница между возвратом 0 и ложным?

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

Я ожидаю, что это решит как истинный, что и делает. Но что происходит, когда я делаю

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

Это также передается на php 5, потому что, насколько я могу выработать, strpos возвращает false, который преобразуется как 0.

Это правильное мышление/поведение? Если да, то каков обходной путь для тестирования на то, что подстрока находится в начале другой строки?

4b9b3361

Ответ 1

Да, это правильное/ожидаемое поведение:

  • strpos может возвращать 0, когда есть совпадение в начале строки
  • и он вернет false, когда совпадение не будет

Дело в том, что вы не должны использовать == для сравнения 0 и false; вы должны использовать ===, например:

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

}

Или:

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

}


Для получения дополнительной информации см. Операторы сравнения:

  • $a == $b будет TRUE, если $a равно $b.
  • $a === $b будет TRUE, если $a равно $b, а они одного типа.

И, цитируя страницу руководства strpos:

Эта функция может возвращать Boolean false, но также может возвращать небулевое значение, которое false, например 0 или "".
Пожалуйста, прочитайте раздел Booleans для больше информации.
Используйте ===оператора для проверки возврата значение этой функции.

Ответ 2

=== и !== сравнить тип и значение:

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

Ответ 3

strpos возвращает int или boolean false. оператор == также оценивает значение 0 в значении false, вы хотите использовать оператор === (три знака равенства), который также проверяет, что сравниваемые типы одинаковы, а не просто видят, могут ли они быть оценены так, чтобы они были одинаковыми.

так

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

Ответ 4

0 - возможное возвращаемое значение из strpos, когда оно находит совпадение в самом начале. Если совпадение не найдено, оно возвращает false (boolean). Поэтому вам нужно проверить возвращаемое значение strpos с помощью оператора ===, который проверяет значение и тип, а не использует ==, который просто проверяет значение.

Ответ 5

Я лично предпочитаю использовать этот способ:

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

или

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

чтобы избежать положения "0", всегда делайте его числом больше 0 приветствия