Stristr: примеры (PHP)

Функция stristr в PHP: примеры и применение
Раздел: Работа со строками
stristr(string haystack, string needle [, bool before_needle]): string|false

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

Аргументы функции
  • $haystack (обязательный) - строка, в которой осуществляется поиск.
  • $needle (обязательный) - искомая подстрока. Если передан не строковый тип, значение преобразуется в целое число и трактуется как код символа.
  • $before_needle (опциональный, по умолчанию false) - логический параметр. Если установлен в true, функция возвращает часть строки $haystack до первого вхождения $needle (исключая саму подстроку).

Функция возвращает часть строки или false, если вхождение не найдено.

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

Базовый поиск
<?php
$str = "Hello World!";
echo stristr($str, "WORLD");
?>
World!
Использование параметра $before_needle
<?php
$email = "user@example.com";
echo stristr($email, "@", true);
?>
user
Поиск по коду символа
<?php
// Поиск символа '@' по его коду (64)
$email = "user@example.com";
echo stristr($email, 64);
?>
@example.com
Случай, когда вхождение не найдено
<?php
$str = "Hello World!";
var_dump(stristr($str, "php"));
?>
bool(false)

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

В PHP существует несколько функций для поиска в строках:

  • strstr() - аналог stristr(), но с учетом регистра. Предпочтительнее, когда важен регистр символов.
  • strpos() и stripos() - возвращают позицию первого вхождения подстроки (с учетом и без учета регистра). Эти функции более эффективны, если нужно только проверить наличие подстроки, а не получить часть строки.
  • strrchr() - находит последнее вхождение символа в строке.
  • strpbrk() - ищет в строке любой символ из заданного набора.

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

Сравнение результата с true
<?php
$str = "Test string";
if (stristr($str, "test") == true) { // Неверно
    echo "Найдено";
}
?>
Найдено

Функция возвращает строку или false. Строка 'Test string' при приведении к булевому типу дает true, что приводит к некорректной проверке. Правильно использовать строгое сравнение с false.

Использование пустой строки в качестве $needle
<?php
$result = stristr("Hello", "");
var_dump($result);
?>
bool(false)

Начиная с PHP 8.0, передача пустой строки в качестве $needle вызывает выдачу предупреждения и возвращает false.

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

  • В PHP 8.0 параметр $needle теперь ожидает строковое значение. Передача целого числа (кода символа) по-прежнему допустима, но передача нестроковых типов, отличных от integer, вызовет предупреждение и преобразование в строку. Передача пустой строки вызывает выдачу ValueError.
  • В PHP 7.3 было объявлено устаревшим использование параметра $needle в виде целого числа, представляющего код символа. Однако это поведение все еще поддерживается.

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

Поиск с использованием различных кодировок
Пример php
<?php
// Функция stristr() бинарно-безопасна и работает с многобайтовыми строками,
// но без учета регистра для многобайтовых кодировок (кроме UTF-8, если не используется mb_stristr).
$str = "Привет Мир!";
echo stristr($str, "МИР");
?>
Мир!
Комбинирование с другими функциями
Пример php
<?php
// Получение домена из email, игнорируя регистр
function getDomain($email) {
    $domain = stristr($email, '@');
    return $domain === false ? false : substr($domain, 1);
}
echo getDomain("USER@EXAMPLE.COM");
?>
EXAMPLE.COM
Обработка нескольких вхождений
Пример php
<?php
// stristr() находит только первое вхождение.
// Для поиска всех вхождений можно использовать цикл.
function findAllOccurrences($haystack, $needle) {
    $positions = [];
    $offset = 0;
    $haystackLower = strtolower($haystack);
    $needleLower = strtolower($needle);
    while (($pos = strpos($haystackLower, $needleLower, $offset)) !== false) {
        $positions[] = $pos;
        $offset = $pos + 1;
    }
    return $positions;
}
print_r(findAllOccurrences("Test test TEST", "test"));
?>
Array
(
    [0] => 0
    [1] => 5
    [2] => 10
)

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

Python

Метод find() или оператор in. Для поиска без учета регистра строку обычно приводят к нижнему регистру.

text = "Hello World!"
substring = "WORLD"
if substring.lower() in text.lower():
    idx = text.lower().find(substring.lower())
    result = text[idx:]
    print(result)
World!
JavaScript

Метод indexOf() в сочетании с toLowerCase(). Прямого аналога нет.

let str = "Hello World!";
let needle = "WORLD";
let idx = str.toLowerCase().indexOf(needle.toLowerCase());
if (idx !== -1) {
    console.log(str.substring(idx));
}
World!
MySQL

Функция LOCATE() или оператор LIKE с регистронезависимым сравнением.

SELECT SUBSTRING('Hello World!', LOCATE('world', 'Hello World!')) AS result;
World!

PHP stristr function comments

En
Stristr Case-insensitive strstr