1

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

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

Функция strripos в PHP

Функция strripos выполняет поиск последнего вхождения подстроки в строке без учета регистра символов. Данная операция полезна при анализе текстовой информации, когда регистр букв неизвестен или не важен для логики программы.

Назначение и применение

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

Аргументы функции
int|false strripos(string $haystack, string $needle, int $offset = 0)

$haystack (строка) – исходная строка, в которой выполняется поиск.

$needle (строка) – искомая подстрока. Начиная с PHP 8.0.0, передача целого числа (int) не поддерживается.

$offset (целое число, необязательный) – смещение, с которого начинается поиск. Если значение отрицательное, поиск осуществляется с конца строки, пропуская указанное количество символов.

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

Базовый поиск подстроки

Поиск последнего вхождения без учета регистра:

$text = 'Синий кит, синий океан, синий цвет.';
$pos = strripos($text, 'СИНИЙ');
echo $pos;
0
Поиск с положительным смещением

Поиск начинается с заданной позиции:

$text = 'Яблоко, яблоко, апельсин, яблоко.';
$pos = strripos($text, 'ЯБЛОКО', 10);
echo $pos;
26
Поиск с отрицательным смещением

Поиск производится с конца строки, смещение указывает количество пропускаемых символов:

$text = 'Первый, второй, третий, второй';
$pos = strripos($text, 'ВТОРОЙ', -10);
echo $pos;
8
Случай отсутствия подстроки

Если подстрока не найдена, функция возвращает false:

$result = strripos('Пример строки', 'слово');
var_dump($result);
bool(false)

Похожие функции в PHP

В PHP существует семейство функций для поиска подстроки, различающихся по регистрозависимости и направлению поиска.

Функция strrpos ищет последнее вхождение подстроки с учетом регистра. Её используют, когда важен точный регистр символов.

Функция stripos находит позицию первого вхождения без учета регистра. Подходит для поиска начального совпадения.

Функция strpos выполняет регистрозависимый поиск первого вхождения. Применяется для точного поиска с начала строки.

Выбор функции

Функцию strripos выбирают для нахождения последнего совпадения, когда регистр не имеет значения. Для регистрозависимого поиска последнего вхождения применяют strrpos.

Типичные ошибки

Некорректное сравнение результата

Возвращаемое значение 0 (найдено в начале строки) и false (не найдено) при нестрогом сравнении могут считаться одинаковыми.

$text = 'Пример строки';
if (strripos($text, 'пример')) { // Возвратит 0, что трактуется как false
    echo 'Найдено';
} else {
    echo 'Не найдено';
}
Не найдено

Правильное сравнение:

if (strripos($text, 'пример') !== false) {
    echo 'Найдено';
}
Передача нестрокового аргумента needle

В PHP 8.0 и выше передача целого числа вместо строки вызывает TypeError.

$pos = strripos('Строка', 123); // До PHP 8.0 искался символ с кодом 123, теперь - ошибка
Отрицательное смещение больше длины строки

Если абсолютное значение отрицательного смещения превышает длину строки, поиск будет производиться с начала строки.

$pos = strripos('Короткая', 'р', -20);
echo $pos;
2

Изменения в версиях PHP

В PHP 8.0.0 функция претерпела значительные изменения, направленные на повышение строгости типов.

Строгий тип параметра needle

Параметр $needle теперь ожидает исключительно строку (string). Передача целого числа (int) вызывает исключение TypeError. Ранее целое число интерпретировалось как ASCII-код символа.

Пример изменения
// В PHP 7.x:
$pos = strripos('abc', 97); // Искал символ 'a', возвращал 0
// В PHP 8.0 и выше:
$pos = strripos('abc', 97); // TypeError: strripos(): Argument #2 ($needle) must be of type string

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

Извлечение части строки после последнего вхождения
Пример php
$path = '/home/user/docs/file.txt';
$pos = strripos($path, '/');
if ($pos !== false) {
    $filename = substr($path, $pos + 1);
    echo $filename;
}
file.txt
Поиск одного из нескольких вариантов

Определение последнего вхождения любого из указанных слов:

Пример php
$text = 'Кот, пес, попугай, кот, хомяк';
$words = ['кот', 'пес'];
$lastPos = false;
foreach ($words as $word) {
    $pos = strripos($text, $word);
    if ($pos !== false && ($lastPos === false || $pos > $lastPos)) {
        $lastPos = $pos;
        $foundWord = $word;
    }
}
echo "Последнее найдено '{$foundWord}' на позиции {$lastPos}";
Последнее найдено 'кот' на позиции 19
Поиск с обработкой многобайтовых строк

Для корректной работы с UTF-8 символами можно использовать комбинацию с mb_strtolower и mb_strrpos.

Пример php
$text = 'Привет, Мир, привет';
$needle = 'МИР';
$pos = mb_strrpos(mb_strtolower($text, 'UTF-8'), mb_strtolower($needle, 'UTF-8'), 0, 'UTF-8');
echo $pos;
9
Рекурсивный поиск всех вхождений с конца
Пример php
function findAllLastOccurrences($haystack, $needle) {
    $positions = [];
    $offset = 0;
    while (($pos = strripos($haystack, $needle, $offset)) !== false) {
        $positions[] = $pos;
        $offset = - (strlen($haystack) - $pos + 1);
    }
    return array_reverse($positions); // Возвращаем в порядке от начала строки
}
$result = findAllLastOccurrences('test TEST Test tEsT', 'test');
print_r($result);
Array
(
    [0] => 0
    [1] => 5
    [2] => 10
    [3] => 15
)

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

Strripos в Python

В Python используют метод str.rfind() для регистрозависимого поиска. Для поиска без учета регистра строки предварительно приводят к одному регистру.

text = 'Синий кит, синий океан.'
pos = text.lower().rfind('синий')
print(pos)
13

Strripos в Javascript

В JavaScript применяют метод String.lastIndexOf(), но он регистрозависимый. Для поиска без учета регистра строки преобразуют.

let text = 'Синий кит, синий океан.';
let pos = text.toLowerCase().lastIndexOf('синий');
console.log(pos);
13

Strripos в MySQL

В MySQL функция LOCATE() или INSTR() выполняют поиск с учетом регистра. Для поиска без учета регистра используют оператор сравнения с COLLATE или функции LOWER().

SELECT LENGTH('Синий кит, синий океан') - LOCATE('синий', REVERSE('Синий кит, синий океан')) - LENGTH('синий') + 2 AS position;
13

PHP strripos function comments

En
Strripos Find the position of the last occurrence of a case-insensitive substring in a string