Intereting Posts
PHP Замечание: преобразование массива в строку только на PHP 7 jQuery JSONP Вызов к PHP-серверу: нет ответа HTTP Получать обновленное значение в MySQL вместо затронутых строк Получить идентификатор пользователя при входе пользователя в систему с использованием Username & Password Как определить, является ли реферер перенаправлением 301 mysql php с загрузкой файла вставить запись в базу данных Как справиться с этим HTML-кодом, эхом, с PHP, который как одинарные, так и двойные кавычки? Как удалить index.php в Yii Framework Завершение сеанса Codeigniter Оптимизация поиска с близлежащим дублированием Программно получить путь к php удаление всех символов из строки, оставляя номера при включении () или require () мне всегда нужно использовать ../../ относительно моего файла? Есть простой способ? PHP Дата для формата даты iCal для DTSTART Заменить первый символ последним символом нескольких строк PHP

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.

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

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

  • 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 для получения дополнительной информации.
Используйте оператор === для проверки возвращаемого значения этой функции.

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

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

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

так

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

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

Я лично предпочитаю так:

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

или

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

чтобы избежать « 0 » позиции, тогда всегда делайте это числом более 0 ура