if(strpos("http://www.example.com","http://www.")==0){ // do work}
Я ожидал бы, что это решит как верный, который это делает. Но что происходит, когда я делаю
if(strpos("abcdefghijklmnop","http://www.")==0){// do work}
Это также передает php 5, потому что насколько я могу удаться, ремни для правки бритв возвращают false, который переводит как 0.
Эти корректные взгляды/поведение? Раз так, каково обходное решение для тестирования, для которого подстрока в начале другой строки?
Да, это правильное / ожидаемое поведение:
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 для дополнительной информации.
Используйте оператор===
для проверки возвращаемого значения этой функции.
===
и ! ==
сравнить тип и значение:
if (strpos("abcdefghijklmnop", "http://www.") !== false){// do work}
0
- возможное возвращаемое значение из strpos
, когда оно находит совпадение в самом начале. Если совпадение не найдено, возвращается false
(логическое). Поэтому вам нужно проверить возвращаемое значение strpos
с помощью оператора ===
, который проверяет значение и тип, а не с помощью ==
, который просто проверяет значение. .
strpos возвращает int или логическое значение false. оператор == также оценивает 0 как ложное, вы хотите использовать оператор === (три знака равенства), который также проверяет, что сравниваемые типы совпадают, вместо того, чтобы просто проверять, могут ли они быть оценены как означающие одно и то же.
поэтому
if (strpos($hastack, $needle) === 0)
{
// the $needle is found at position 0 in the $haystack
}