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

Поиск позиции подстроки с iconv_strpos в PHP
Раздел: Кодировки символов
iconv_strpos(string $haystack, string $needle, int $offset = 0, ?string $encoding = null): int|false

Функция iconv_strpos

Описание и назначение

Функция iconv_strpos выполняет поиск позиции первого вхождения подстроки в строку. Основное отличие от стандартной strpos заключается в поддержке различных кодировок символов через библиотеку iconv. Это делает функцию незаменимой при работе с многобайтовыми кодировками, такими как UTF-8, где один символ может занимать несколько байт.

Аргументы функции
  • haystack (string): Строка, в которой выполняется поиск.
  • needle (string): Искомая подстрока.
  • offset (int): Необязательный параметр. Позиция с которой начинается поиск. Если указан, поиск начнется с этого количества символов от начала строки. По умолчанию равен 0.
  • encoding (string|null): Необязательный параметр. Кодировка символов строк. Если параметр опущен или равен null, будет использована кодировка из текущей локали (iconv.internal_encoding).

Функция возвращает целое число - позицию первого вхождения подстроки, начиная с 0. Если подстрока не найдена, возвращается false.

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

Базовый поиск
<?php
$text = 'Привет, мир!';
$pos = iconv_strpos($text, 'мир');
var_dump($pos);
?>
int(8)
Поиск с указанием кодировки
<?php
$text = 'Пример текста';
$pos = iconv_strpos($text, 'текста', 0, 'UTF-8');
var_dump($pos);
?>
int(7)
Поиск с указанием offset
<?php
$text = 'абв абв';
$pos = iconv_strpos($text, 'абв', 3, 'UTF-8');
var_dump($pos);
?>
int(4)
Случай, когда подстрока не найдена
<?php
$text = 'Строка для поиска';
$result = iconv_strpos($text, 'нет', 0, 'UTF-8');
var_dump($result);
?>
bool(false)

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

mb_strpos

Функция из расширения mbstring. Аналогична iconv_strpos, но предназначена для работы с многобайтовыми кодировками через свое внутреннее представление. Часто предпочтительнее для сложных операций со строками в UTF-8 из-за более широкого набора функций в расширении.

strpos

Стандартная функция PHP. Работает корректно только с однобайтовыми кодировками (например, ASCII, ISO-8859-1). При использовании с многобайтовыми кодировками может возвращать некорректные позиции, так как считает байты, а не символы.

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

Для многобайтовых кодировок, особенно UTF-8, следует использовать iconv_strpos или mb_strpos. iconv_strpos может быть полезен, когда основная работа ведется с библиотекой iconv. mb_strpos часто является более стандартным выбором в современном PHP-коде.

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

Iconv strpos в Python

В Python строки по умолчанию Unicode. Для поиска позиции используется метод str.find() или str.index(). Разница в том, что find() возвращает -1 при неудаче, а index() вызывает исключение.

text = 'Привет, мир!'
pos = text.find('мир')
print(pos)
8

Iconv strpos в Javascript

В JavaScript для строк используется метод indexOf(). Он возвращает индекс первого вхождения или -1.

let text = 'Привет, мир!';
let pos = text.indexOf('мир');
console.log(pos);
8

Iconv strpos в MySQL

В SQL для поиска позиции в строке используется функция INSTR() или LOCATE(). Они возвращают позицию, начиная с 1, и 0 если подстрока не найдена.

SELECT INSTR('Привет, мир!', 'мир') AS position;
position: 9

В отличие от PHP, в MySQL позиции отсчитываются с 1, а не с 0.

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

Сравнение результата без учета типа

Поскольку функция возвращает false при неудаче, а 0 при нахождении в начале строки, строгое сравнение с false необходимо.

<?php
$text = 'Начало';
$pos = iconv_strpos($text, 'Начало', 0, 'UTF-8');
if ($pos == false) { // Неправильно! 0 == false истинно.
    echo 'Не найдено';
}
?>
Не найдено

Правильный подход - использовать оператор тождественного сравнения.

<?php
if ($pos === false) {
    echo 'Не найдено';
} else {
    echo 'Найдено на позиции: ' . $pos;
}
?>
Найдено на позиции: 0
Некорректная кодировка

Указание неверной кодировки может привести к ошибке или некорректному результату.

<?php
$text = 'Текст в UTF-8';
$pos = iconv_strpos($text, 'в', 0, 'ISO-8859-1'); // Кодировка не совпадает.
var_dump($pos);
?>
bool(false)

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

PHP 8.0

Начиная с PHP 8.0, параметр encoding стал nullable (может принимать значение null). В более ранних версиях это была строка, и значение по умолчанию определялось конфигурацией iconv. Теперь явное указание null разрешено и приводит к использованию кодировки из текущей локали.

Предыдущие версии

В PHP 5 и 7 функция вела себя схожим образом. Существенных изменений в поведении не было.

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

Поиск всех вхождений подстроки
Пример php
<?php
function findAllPositions($haystack, $needle, $encoding = 'UTF-8') {
    $positions = [];
    $offset = 0;
    while (($pos = iconv_strpos($haystack, $needle, $offset, $encoding)) !== false) {
        $positions[] = $pos;
        $offset = $pos + iconv_strlen($needle, $encoding);
    }
    return $positions;
}

$text = 'банан';
$result = findAllPositions($text, 'ан', 'UTF-8');
print_r($result);
?>
Array
(
    [0] => 2
)
Использование с потоком ввода/вывода

Поиск в содержимом файла, прочитанного в строку.

Пример php
<?php
$content = file_get_contents('data.txt'); // Файл в UTF-8
$searchWord = 'ключевое';
$pos = iconv_strpos($content, $searchWord, 0, 'UTF-8');
if ($pos !== false) {
    echo 'Слово найдено в файле на позиции: ' . $pos;
}
?>
Слово найдено в файле на позиции: 1024
Обработка пользовательского ввода
Пример php
<?php
// Предположим, данные пришли из формы.
$userText = $_POST['text'] ?? '';
$forbiddenWord = 'спам';

// Проверка на наличие запрещенного слова.
if (iconv_strpos(mb_strtolower($userText, 'UTF-8'), $forbiddenWord, 0, 'UTF-8') !== false) {
    echo 'Текст содержит запрещенное слово.';
}
?>

PHP iconv_strpos function comments

En
Iconv strpos Finds position of first occurrence of a needle within a haystack