Iconv strrpos: примеры (PHP)
iconv_strrpos(string $haystack, string $needle, ?string $encoding = null): int|falseФункция iconv_strrpos выполняет поиск последнего вхождения подстроки в строку с учетом кодировки символов. Она используется при работе с многобайтовыми кодировками, где стандартные строковые функции PHP могут работать некорректно.
Функция применяется для поиска позиции последнего вхождения подстроки в строках, закодированных в различных кодировках, таких как UTF-8, Windows-1251, KOI8-R. Это особенно важно при обработке текстов на разных языках, включая кириллицу, иероглифические и другие нелатинские символы.
Функция принимает три аргумента:
- haystack (обязательный) — строка, в которой выполняется поиск.
- needle (обязательный) — подстрока для поиска.
- encoding (обязательный) — кодировка входных строк. Если аргумент опущен или равен null, используется кодировка iconv.internal_encoding.
- offset (необязательный) — смещение в строке для начала поиска. По умолчанию равен длине строки (поиск с конца).
Функция возвращает числовую позицию последнего вхождения подстроки (счет начинается с 0) или false в случае ошибки или отсутствия подстроки.
$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)
Функция strrpos выполняет аналогичный поиск, но не поддерживает многобайтовые кодировки. Используется только для однобайтовых кодировок (ASCII, Latin-1).
Функция 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 8.0 функция iconv strrpos перестала возвращать false при передаче пустой строки в качестве needle. Теперь это вызывает TypeError. Также улучшена обработка ошибок недопустимых аргументов.
Добавлена поддержка необязательного аргумента offset для указания смещения поиска.
$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
$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
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