До PHP 8.0.0 нестроковый аргумент needle
преобразовывался в целое число и заменялся на символ с этим порядковым значением в однобайтовой таблице символов.
Начиная с PHP 7.3.0 передача нестроковых значений устарела и полагаться на него настоятельно не рекомендуют.
Перед вызовом функции нестроковый аргумент needle требовалось
либо приводить к строке, либо получать строковое значение символа функцией chr().
offset
При установке параметра поиск начинается с заданного количества символов
с начала строки. При установке отрицательного значения отсчёт позиции начала поиска
выполняется с конца строки.
Функция возвращает позицию, в которой находится искомая строка, относительно
начала строки haystack независимо от смещения (offset).
Обратите также внимание, что позиция строки отсчитывается от 0, а не от 1.
Функция возвращает значение false, если не находит подстроку.
Внимание
Функция
возвращает как логическое значение false,
так и нелогическое значение, которое приводится к false.
Прочитайте раздел
«Логический тип»,
чтобы получить дополнительную информацию.
Используйте оператор ===
для проверки значения, которое возвращает функция.
Приведение к единому регистру больше не зависит от региональных настроек,
которые установили функцией setlocale().
Преобразовываются только символы кодировки ASCII.
Байты, которые не относятся к кодировке ASCII, сравнятся по значению байта.
8.0.0
Параметр needle теперь разрешает пустую строку.
8.0.0
Передача целого числа (int) в параметр needle больше не поддерживается.
7.3.0
Передача целого числа (int) в параметр needle устарела.
7.1.0
Добавили поддержку отрицательных значений параметром offset.
// Конечно, подстрока 'a' не входит в строку 'xyz' if ($pos1 === false) { echo "Функция не нашла '$findme' в строке '$mystring1'", PHP_EOL; }
// Заметьте, что выполняется строгое сравнение оператором !==. Оператор != сработает // не так, как ожидается, поскольку символ 'a' идёт первым и поэтому стоит в нулевой позиции if ($pos2 !== false) { echo "Функция нашла подстроку '$findme' в строке '$mystring2' на позиции $pos2", PHP_EOL; }
I found myself needing to find the first position of multiple needles in one haystack. So I wrote this little function:
<?php function multineedle_stripos($haystack, $needles, $offset=0) { foreach($needles as $needle) { $found[$needle] = stripos($haystack, $needle, $offset); } return $found; }
// It works as such: $haystack = "The quick brown fox jumps over the lazy dog."; $needle = array("fox", "dog", ".", "duck") var_dump(multineedle_stripos($haystack, $needle)); /* Output: array(3) { ["fox"]=> int(16) ["dog"]=> int(40) ["."]=> int(43) ["duck"]=> bool(false) } */ ?>
It is very bad practice to use the same function name as an existing php function but have a different output format. Someone maintaining the code in the future is likely to be very confused by this. It will also be hard to eradicate from a codebase because the naming is identical so each use of stripos() would have to be analyzed to see how it is expecting the output format (bool or number/bool).
Calling it string_found() or something like that would make a lot more sense for long-term use.
Regarding the === note, it might be worth clarifying that the correct tests for a binary found/not found condition are !==false to detect found, and ===false to detect not found.