Iconv strrpos: примеры (PHP)

Полный обзор iconv_strrpos: многобайтовый поиск в PHP
Раздел: Кодировки символов
iconv_strrpos(string $haystack, string $needle, ?string $encoding = null): int|false
Функция iconv_strrpos в PHP

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

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

Функция применяется для поиска позиции последнего вхождения подстроки в строках, закодированных в различных кодировках, таких как UTF-8, Windows-1251, KOI8-R. Это особенно важно при обработке текстов на разных языках, включая кириллицу, иероглифические и другие нелатинские символы.

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

Функция принимает три аргумента:

  • haystack (обязательный) — строка, в которой выполняется поиск.
  • needle (обязательный) — подстрока для поиска.
  • encoding (обязательный) — кодировка входных строк. Если аргумент опущен или равен null, используется кодировка iconv.internal_encoding.
  • offset (необязательный) — смещение в строке для начала поиска. По умолчанию равен длине строки (поиск с конца).

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

Примеры использования iconv_strrpos
Базовый поиск в строке
$text = 'Программирование на PHP и JavaScript';
$pos = iconv_strrpos($text, 'на', 'UTF-8');
echo $pos;
13
Поиск с указанием смещения
$text = 'тест тест тест';
$pos = iconv_strrpos($text, 'тест', 'UTF-8', 5);
echo $pos;
10
Поиск отсутствующей подстроки
$text = 'Пример строки';
$pos = iconv_strrpos($text, 'слово', 'UTF-8');
var_dump($pos);
bool(false)
Альтернативные функции в PHP
strrpos

Функция strrpos выполняет аналогичный поиск, но не поддерживает многобайтовые кодировки. Используется только для однобайтовых кодировок (ASCII, Latin-1).

mb_strrpos

Функция mb_strrpos из расширения mbstring обеспечивает поиск с поддержкой многобайтовых кодировок. Она более универсальна и часто используется в современных PHP-приложениях. Функция iconv_strrpos предпочтительнее при работе с определенными кодировками, которые лучше обрабатываются библиотекой iconv.

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

Для работы с UTF-8 рекомендуется использовать mb_strrpos. Функцию iconv_strrpos применяют при обработке специфических или устаревших кодировок, где требуется точное преобразование символов.

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

Iconv strrpos в Python

text = 'Программирование на Python и PHP'
position = text.rfind('на')
print(position)
13

Метод rfind выполняет поиск последнего вхождения без учета кодировки, так как строки Python 3 по умолчанию Unicode.

Iconv strrpos в Javascript

let text = 'Программирование на JavaScript';
let position = text.lastIndexOf('на');
console.log(position);
13

Метод lastIndexOf работает с символами UTF-16, что может приводить к некорректным результатам для некоторых символов.

Iconv strrpos в MySQL

SELECT INSTR(REVERSE('Пример строки'), REVERSE('стр')) as pos;
8

MySQL не имеет прямой функции для поиска последнего вхождения, используется комбинация функций INSTR и REVERSE.

Типичные ошибки
Некорректная кодировка
$pos = iconv_strrpos('Пример', 'и', 'неверная_кодировка');
var_dump($pos);
bool(false)

Функция возвращает false при указании неизвестной кодировки.

Отрицательное смещение
$pos = iconv_strrpos('тест', 'т', 'UTF-8', -2);
var_dump($pos);
bool(false)

Отрицательные смещения не поддерживаются и приводят к возврату false.

Пустая строка поиска
$pos = iconv_strrpos('строка', '', 'UTF-8');
var_dump($pos);
bool(false)
Изменения в версиях PHP
PHP 8.0

В PHP 8.0 функция iconv strrpos перестала возвращать false при передаче пустой строки в качестве needle. Теперь это вызывает TypeError. Также улучшена обработка ошибок недопустимых аргументов.

PHP 5.2.0

Добавлена поддержка необязательного аргумента offset для указания смещения поиска.

Расширенные примеры
Поиск в различных кодировках
Пример php
$text_utf8 = 'Привет, мир!';
$text_cp1251 = iconv('UTF-8', 'Windows-1251', $text_utf8);
$pos1 = iconv_strrpos($text_utf8, 'ир', 'UTF-8');
$pos2 = iconv_strrpos($text_cp1251, iconv('UTF-8', 'Windows-1251', 'ир'), 'Windows-1251');
echo "UTF-8 позиция: $pos1\n";
echo "Windows-1251 позиция: $pos2";
UTF-8 позиция: 9
Windows-1251 позиция: 9
Извлечение подстроки после последнего вхождения
Пример php
$path = '/home/user/docs/file.txt';
$pos = iconv_strrpos($path, '/', 'UTF-8');
$filename = iconv_substr($path, $pos + 1, null, 'UTF-8');
echo $filename;
file.txt
Поиск с обработкой ошибок
Пример php
function safe_strrpos($haystack, $needle, $encoding = 'UTF-8') {
    if (empty($needle)) {
        throw new InvalidArgumentException('Искомая подстрока не может быть пустой');
    }
    $pos = iconv_strrpos($haystack, $needle, $encoding);
    return $pos !== false ? $pos : -1;
}

try {
    echo safe_strrpos('тестовая строка', 'стр', 'UTF-8');
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
9

PHP iconv_strrpos function comments

En
Iconv strrpos Finds the last occurrence of a needle within a haystack