1

Strpos: примеры (PHP)

Использование strpos в PHP: полный обзор функции поиска
Раздел: Работа со строками
strpos(string haystack, string needle [, int offset]): int|false

Основы функции strpos

Описание и назначение

Функция strpos выполняет поиск первого вхождения подстроки в строке. Она используется при необходимости определить позицию фрагмента текста, валидации данных, парсинге строк или обработке пользовательского ввода.

Аргументы функции

Синтаксис: strpos(string $haystack, string $needle, int $offset = 0): int|false

  • $haystack - строка, в которой выполняется поиск
  • $needle - искомая подстрока
  • $offset - необязательный параметр, указывающий позицию начала поиска (по умолчанию 0)

Функция возвращает позицию первого вхождения (начиная с 0) или false, если подстрока не найдена.

Базовые примеры использования

Простой поиск подстроки
echo strpos('Hello world', 'world');
6
Поиск с указанием offset
echo strpos('test test test', 'test', 5);
5
Проверка наличия подстроки
if (strpos('PHP 8.0', '8') !== false) {
    echo 'Версия 8 найдена';
}
Версия 8 найдена
Поиск с регистрозависимостью
echo strpos('Case Sensitive', 's');
5

Альтернативные функции в PHP

stripos - регистронезависимый поиск

Ищет первое вхождение подстроки без учета регистра. Предпочтительна при нечувствительном к регистру поиске.

strrpos - поиск последнего вхождения

Находит позицию последнего вхождения подстроки. Используется при необходимости найти конечное появление фрагмента.

str_contains - проверка наличия подстроки

Доступна с PHP 8.0, возвращает булево значение. Удобна для простых проверок без получения позиции.

preg_match - регулярные выражения

Применяется для сложных паттернов поиска. Менее эффективна для простых задач, но мощна для сложных шаблонов.

Распространенные ошибки

Некорректная проверка возвращаемого значения
if (strpos('Text', 'T')) {
    echo 'Найдено';
} else {
    echo 'Не найдено';
}
Не найдено

Позиция 0 интерпретируется как false. Необходимо использовать строгое сравнение: !== false.

Поиск пустой строки
echo strpos('Test', '');
0

Поиск пустой подстроки возвращает 0, что может быть неожиданно.

Неправильный тип аргументов
echo strpos(['array'], 'needle');
TypeError

В PHP 8 передача нестроковых значений вызывает TypeError.

Изменения в последних версиях PHP

PHP 8.0: Строгая типизация

Вызов функции с аргументами нестрокового типа теперь вызывает TypeError. Ранее нестроковые значения преобразовывались.

strpos(null, 'needle');
TypeError в PHP 8.0+
Результат: 0 в PHP 7.4
PHP 8.0: Изменение порядка параметров в strpos()

Функция strpos() теперь требует явного указания строковых параметров, что повышает надежность кода.

Расширенные примеры применения

Поиск всех вхождений подстроки
Пример php
$text = 'aba ab a abab';
$search = 'ab';
$offset = 0;
$positions = [];
while (($pos = strpos($text, $search, $offset)) !== false) {
    $positions[] = $pos;
    $offset = $pos + 1;
}
print_r($positions);
Array
(
    [0] => 0
    [1] => 3
    [2] => 8
    [3] => 10
)
Извлечение домена из URL
Пример php
$url = 'https://example.com/page';
$schemePos = strpos($url, '://');
if ($schemePos !== false) {
    $domainStart = $schemePos + 3;
    $pathPos = strpos($url, '/', $domainStart);
    $domain = ($pathPos !== false) 
        ? substr($url, $domainStart, $pathPos - $domainStart) 
        : substr($url, $domainStart);
    echo $domain;
}
example.com
Обработка многострочного текста
Пример php
$content = "Первая строка\nВторая строка\nТретья";
$needle = 'строка';
$line = 1;
$offset = 0;
while (($pos = strpos($content, $needle, $offset)) !== false) {
    $before = substr($content, 0, $pos);
    $lineNumber = substr_count($before, "\n") + 1;
    echo "Найдено в строке: $lineNumber\n";
    $offset = $pos + 1;
}
Найдено в строке: 1
Найдено в строке: 2
Поиск с отрицательным offset

В PHP 8.1+ offset может быть отрицательным, указывая позицию с конца строки.

Пример php
echo strpos('abcdef', 'c', -4);
2

Аналоги в других языках

Python: find() и index()
text = 'Python programming'
print(text.find('pro'))
print(text.index('pro'))
7
7

find() возвращает -1 при отсутствии, index() генерирует исключение.

JavaScript: indexOf()
let text = 'JavaScript';
console.log(text.indexOf('Script'));
4

Возвращает -1 при отсутствии подстроки.

MySQL: LOCATE() и INSTR()
SELECT LOCATE('base', 'database'), INSTR('database', 'base');
5, 5

Нумерация позиций начинается с 1. LOCATE() поддерживает параметр начала поиска.

PHP strpos function comments

En
Strpos Find the position of the first occurrence of a substring in a string