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
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
Ищет первое вхождение подстроки без учета регистра. Предпочтительна при нечувствительном к регистру поиске.
Находит позицию последнего вхождения подстроки. Используется при необходимости найти конечное появление фрагмента.
Доступна с PHP 8.0, возвращает булево значение. Удобна для простых проверок без получения позиции.
Применяется для сложных паттернов поиска. Менее эффективна для простых задач, но мощна для сложных шаблонов.
Распространенные ошибки
if (strpos('Text', 'T')) {
echo 'Найдено';
} else {
echo 'Не найдено';
}Не найдено
Позиция 0 интерпретируется как false. Необходимо использовать строгое сравнение: !== false.
echo strpos('Test', '');0
Поиск пустой подстроки возвращает 0, что может быть неожиданно.
echo strpos(['array'], 'needle');TypeError
В PHP 8 передача нестроковых значений вызывает TypeError.
Изменения в последних версиях PHP
Вызов функции с аргументами нестрокового типа теперь вызывает TypeError. Ранее нестроковые значения преобразовывались.
strpos(null, 'needle');TypeError в PHP 8.0+ Результат: 0 в PHP 7.4
Функция strpos() теперь требует явного указания строковых параметров, что повышает надежность кода.
Расширенные примеры применения
$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 = '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
$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
В PHP 8.1+ offset может быть отрицательным, указывая позицию с конца строки.
echo strpos('abcdef', 'c', -4);2
Аналоги в других языках
text = 'Python programming'
print(text.find('pro'))
print(text.index('pro'))7 7
find() возвращает -1 при отсутствии, index() генерирует исключение.
let text = 'JavaScript';
console.log(text.indexOf('Script'));4
Возвращает -1 при отсутствии подстроки.
SELECT LOCATE('base', 'database'), INSTR('database', 'base');5, 5
Нумерация позиций начинается с 1. LOCATE() поддерживает параметр начала поиска.