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)
<?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
Функция из расширения mbstring. Аналогична iconv_strpos, но предназначена для работы с многобайтовыми кодировками через свое внутреннее представление. Часто предпочтительнее для сложных операций со строками в UTF-8 из-за более широкого набора функций в расширении.
Стандартная функция 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, параметр encoding стал nullable (может принимать значение null). В более ранних версиях это была строка, и значение по умолчанию определялось конфигурацией iconv. Теперь явное указание null разрешено и приводит к использованию кодировки из текущей локали.
В PHP 5 и 7 функция вела себя схожим образом. Существенных изменений в поведении не было.
Расширенные примеры
<?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
$content = file_get_contents('data.txt'); // Файл в UTF-8
$searchWord = 'ключевое';
$pos = iconv_strpos($content, $searchWord, 0, 'UTF-8');
if ($pos !== false) {
echo 'Слово найдено в файле на позиции: ' . $pos;
}
?>Слово найдено в файле на позиции: 1024
<?php
// Предположим, данные пришли из формы.
$userText = $_POST['text'] ?? '';
$forbiddenWord = 'спам';
// Проверка на наличие запрещенного слова.
if (iconv_strpos(mb_strtolower($userText, 'UTF-8'), $forbiddenWord, 0, 'UTF-8') !== false) {
echo 'Текст содержит запрещенное слово.';
}
?>