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 'Найдено';
}В PHP 8.0 и выше передача целого числа вместо строки вызывает TypeError.
$pos = strripos('Строка', 123); // До PHP 8.0 искался символ с кодом 123, теперь - ошибкаЕсли абсолютное значение отрицательного смещения превышает длину строки, поиск будет производиться с начала строки.
$pos = strripos('Короткая', 'р', -20);
echo $pos;2
Изменения в версиях PHP
В PHP 8.0.0 функция претерпела значительные изменения, направленные на повышение строгости типов.
Параметр $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Расширенные примеры
$path = '/home/user/docs/file.txt';
$pos = strripos($path, '/');
if ($pos !== false) {
$filename = substr($path, $pos + 1);
echo $filename;
}file.txt
Определение последнего вхождения любого из указанных слов:
$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.
$text = 'Привет, Мир, привет';
$needle = 'МИР';
$pos = mb_strrpos(mb_strtolower($text, 'UTF-8'), mb_strtolower($needle, 'UTF-8'), 0, 'UTF-8');
echo $pos;9
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