(PHP 5, PHP 7, PHP 8)

striposВозвращает позицию первого вхождения подстроки без учёта регистра


stripos(string $haystack, string $needle, int $offset = 0): int|false

Ищет позицию первого вхождения подстроки needle в строке haystack.

В отличие от strpos(), эта функция не учитывает регистр символов.

Список параметров


Строка, в которой производится поиск.


Строка для поиска.

До PHP 8.0.0, если параметр needle не является строкой, он преобразуется в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0, и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведён к строке, либо должен быть выполнен явный вызов chr().


Если этот параметр указан, то поиск будет начат с указанного количества символов с начала строки. Если задано отрицательное значение, отсчёт позиции начала поиска будет произведён с конца строки.

Возвращаемые значения

Возвращает позицию, в которой находится искомая строка, относительно начала строки haystack (независимо от смещения (offset)). Также обратите внимание на то, что позиция строки отсчитывается от 0, а не от 1.

Возвращает false, если искомая строка не найдена.


Эта функция может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия Описание
8.2.0 Преобразование регистра больше не зависит от локали, установленной с помощью функции setlocale(). Будут преобразованы только символы ASCII. Байты не ASCII-кодировке будут сравниваться по значению байта.
8.0.0 Параметр needle теперь допускает пустую строку.
8.0.0 Передача целого числа (int) в needle больше не поддерживается.
7.3.0 Передача целого числа (int) в needle объявлена устаревшей.
7.1.0 Добавлена поддержка отрицательных значений offset.


Пример #1 Пример использования stripos()

= 'a';
$mystring1 = 'xyz';
$mystring2 = 'ABC';

$pos1 = stripos($mystring1, $findme);
$pos2 = stripos($mystring2, $findme);

// Конечно, 'a' не входит в 'xyz'
if ($pos1 === false) {
"Строка '$findme' не найдена в строке '$mystring1'";

// Заметьте, что используется ===. Использование == не даст верного
// результата, так как 'a' в нулевой позиции.
if ($pos2 !== false) {
"Нашёл '$findme' в '$mystring2' в позиции $pos2";


Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • mb_stripos() - Регистронезависимый поиск позиции первого вхождения одной строки в другую
  • str_contains() - Определяет, содержит ли строка заданную подстроку
  • str_ends_with() - Проверяет, заканчивается ли строка заданной подстрокой
  • str_starts_with() - Проверяет, начинается ли строка с заданной подстроки
  • strpos() - Возвращает позицию первого вхождения подстроки
  • strrpos() - Возвращает позицию последнего вхождения подстроки в строке
  • strripos() - Возвращает позицию последнего вхождения подстроки без учёта регистра
  • stristr() - Регистронезависимый вариант функции strstr
  • substr() - Возвращает подстроку
  • str_ireplace() - Регистронезависимый вариант функции str_replace

add a note

User Contributed Notes 8 notes

emperorshishire at gmail dot com
14 years ago
I found myself needing to find the first position of multiple needles in one haystack. So I wrote this little function:

function multineedle_stripos($haystack, $needles, $offset=0) {
$needles as $needle) {
$found[$needle] = stripos($haystack, $needle, $offset);

// 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) {
sorrynorealemail at example dot com
5 years ago
Unlike strpos() it seems that stripos() does NOT issue a WARNING if the needle is an empty string ''.
spam at kleppinger dot com
8 years ago
Regarding the function by spam at wikicms dot org

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.
emanuel dot karlsson at rolfsbuss dot se
5 years ago
Finding numbers in strings requires you to cast the number to string first.

strpos("123", 2) !== strpos("123", "2")
Ian Macdonald
8 years ago
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.
steve at opilo dot net
10 years ago
A handy function if you need to adjust layout based on whether or not a string contains descending letters:

<?php function containsDescenders($text) {
$descenders = array("g","j","p","q","y");
foreach (
$descenders as $letter) {
if (
stripos($text,$letter) !== false) {
spam at wikicms dot org
9 years ago
If you like using ternary operator, I wrote simple example how to use stripos function.
Also, in my example I add "How to use namespaces" for wide knowledges for newbies.

namespace My;

//You can be free using core functions in your NameSpaces (My)
function stripos($haystack, $needle) {
//To call core function (from global NS) you should add backslash only - \func
return (FALSE === \stripos($haystack, $needle)) ? FALSE : TRUE;

var_dump(stripos($haystack = 'John knows English language.', $needle = 'john')); //TRUE
var_dump(stripos($haystack = 'Sara knows English language too.', $needle = 'john')); //FALSE
grf at post dot cz
16 years ago
this would to work with any language, i hope.
tested on czech (eastern europe) lang.

* function finds and encase every string in a $needleArr array with
* strings $shearLft (from the left side) and $shearRgt (guess from which
* side).
* already encased needles are IGNORED for any other step, so order
* of needles in $needleArr is pretty important.
* function is searching needles in case-insensitive mode,
* but case in the subject is saved.
* can you do it better? so, do it.
* @param array $needleArr array of needles
* @param string $shearLft left shear
* @param string $shearRgt right shear
* @param string $subject subject
* @param string $encoding encoding ('utf-8' is default)
* @author griffin
function safeHighlight( $needleArr, $shearLft, $shearRgt, $subject, $encoding = 'utf-8')

// encoding
$e = $encoding;

// oh, no needles
if( !is_array( $needleArr))

// empty keys throw-off, only unique, reindex
$nA = array_values(
array_diff( $needleArr, array(''))

// needle count
if( !($nC = count( $nA)))
$subject; // nothing to hl

// shear length
if( !(($rLL = mb_strlen( $rL = $shearLft, $e))
+ (
$rRL = mb_strlen( $rR = $shearRgt, $e))))
$subject; // no shears

// subject length
if( !($sL = mb_strlen( $s = $subject, $e)))
null; // empty subject

// subject in lowercase (we need to aviod
// using mb_stripos due to PHP version)
$sW = mb_strtolower( $s, $e);

// masking ~ 0=not changed, 1=changed
$m = str_repeat( '0', $sL);

// loop for each needle
for( $n=0; $n<$nC; $n++)

// needle string loWercase
$nW = mb_strtolower( $nA[ $n], $e);

$o = 0; // offset
$nL = mb_strlen( $nW, $e); // needle length

// search needle
while( false !== ($p = mb_strpos( $sW, $nW, $o, $e)))
// oh hurrey, needle found on $p position

// is founded needle already modified? (in full-length)
for( $q=$p; $q<($p+$nL); $q++)
$m[ $q])
// ai, caramba. already modified, jump over
$o+= $nL;

// continue for while() loop - not for for() loop!
continue 2;

// explode subject and mask into three parts
// partA|needle|partB
$sE[0] = mb_substr( $s, 0, $p, $e);
$sE[1] = mb_substr( $s, $p, $nL, $e);
$sE[2] = mb_substr( $s, $p+$nL, $sL-$p-$nL, $e);

// mask
// partA|partB (needle not needed)
$mE[0] = mb_substr( $m, 0, $p, $e);
$mE[1] = mb_substr( $m, $p+$nL, $sL-$p-$nL, $e);

// apply shears
$sE[1] = $rL.$sE[1].$rR;

// update sunject length
$sL+= $rLL + $rRL;

// update mask
$m = $mE[0] . str_repeat( '1', $rLL + $nL + $rRL) . $mE[1];

// implode into a subject
$s = implode( $sE);

// update lowercase subject
$sW = mb_strtolower( $s, $e);

// increase offset
$o+= $rLL + $nL + $rRL;

// end of string reached
if( $o>=$sL)

// while()

} // for( $n=0; $n<$nC; $n++)

// oouu yeaaa, kick the subject out of the function
return $s;

// function safeHighlight()
To Top