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, потому что насколько я могу удаться, ремни для правки бритв возвращают false, который переводит как 0.

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

20
задан Charles 24 December 2012 в 21:17
поделиться

4 ответа

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

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

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

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

}

Или:

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

}


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

  • $ a == $ b будет ИСТИНА , если $ a равно $ b .
  • $ a === $ b будет ИСТИНА , если $ a равно $ b , а они однотипный .

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

Эта функция может возвращать логическое значение FALSE , но также может возвращать {{1 }} не-логическое значение, которое вычисляется как FALSE , например 0 или "" .
Пожалуйста, прочтите раздел о Booleans для дополнительной информации.
Используйте оператор === для проверки возвращаемого значения этой функции.

51
ответ дан 29 November 2019 в 22:43
поделиться

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

if (strpos("abcdefghijklmnop", "http://www.") !== false){// do work}
11
ответ дан 29 November 2019 в 22:43
поделиться

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

1
ответ дан 29 November 2019 в 22:43
поделиться

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

поэтому

if (strpos($hastack, $needle) === 0)
{
    // the $needle is found at position 0 in the $haystack
}
5
ответ дан 29 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: