stristr()
Функция stristr() в PHP находит первое вхождение подстроки в строке без учёта регистра и возвращает часть строки начиная с этого места.
Введение
stristr() — это строковая функция PHP, которая находит первое вхождение подстроки в строке, игнорируя регистр букв, и возвращает всё начиная с этого места до конца строки. Если подстрока не найдена, возвращается false.
Это аналог strstr() без учёта регистра. Используйте stristr(), когда при поиске Hello, HELLO и hello должны считаться одинаковыми — например при поиске ключевых слов, введённых пользователем, разборе адреса электронной почты или разбивке строки по разделителю вне зависимости от регистра.
На этой странице рассматриваются синтаксис, возвращаемое значение, необязательный параметр $before_needle, типичные ошибки, а также отличие stristr() от связанных функций.
Синтаксис
stristr(string $haystack, string $needle, bool $before_needle = false): string|false| Параметр | Описание |
|---|---|
$haystack | Строка, в которой выполняется поиск. |
$needle | Искомая подстрока. Сравнение без учёта регистра. |
$before_needle | Необязательный. Если true, возвращает часть $haystack до первого совпадения, а не после него. |
Возвращаемое значение: найденная часть $haystack (с сохранением исходного регистра, без приведения к нижнему), либо false, если $needle не найдена.
Базовый пример
Хотя мы искали "BROWN" в верхнем регистре, stristr() нашла строчное brown в тексте и вернула остаток предложения начиная с этого слова — с сохранением исходного регистра.
Получение части строки до совпадения
Передайте true третьим аргументом, чтобы вернуть всё до первого совпадения. Это удобно для разбивки строки по разделителю, например для извлечения имени пользователя из адреса электронной почты:
<?php
$email = "[email protected]";
$after = stristr($email, "@"); // from "@" onward
$before = stristr($email, "@", true); // up to (not including) "@"
echo $after . "\n"; // @Example.com
echo $before . "\n"; // UserПроверка наличия подстроки
Распространённая ошибка — использовать stristr() как булевое условие. Это работает, но необходимо сравнивать со строгим оператором !== и значением false, поскольку возвращаемая строка сама может быть ложной (например "0"):
<?php
$text = "Contact us at [email protected]";
if (stristr($text, "support") !== false) {
echo "Contains 'support' (any case)";
} else {
echo "Not found";
}
// Output: Contains 'support' (any case)Если нужно лишь узнать, существует ли подстрока, а сам фрагмент не нужен — предпочтите stripos() (позиция без учёта регистра) или strpos() (позиция с учётом регистра). Они возвращают индекс совпадения и работают чуть быстрее, так как не копируют остаток строки.
stristr() vs. связанные функции
| Функция | Учёт регистра? | Возвращает |
|---|---|---|
stristr() | Нет | Найденная подстрока (или false) |
strstr() | Да | Найденная подстрока (или false) |
stripos() | Нет | Индекс позиции (или false) |
strpos() | Да | Индекс позиции (или false) |
Используйте stristr(), когда нужен текст начиная с совпадения без учёта регистра. Используйте stripos()/strpos(), когда нужна только позиция или ответ да/нет.
Примечания и подводные камни
falsevs. пустая строка. Успешное совпадение никогда не возвращает пустую строку в начале, но совпадение в самом конце$haystackвозвращает только искомую подстроку. Всегда проверяйте с помощью!== false.- Регистр игнорируется только при поиске. Возвращаемая подстрока сохраняет регистр из исходного
$haystack. - Многобайтовый текст / UTF-8.
stristr()работает на уровне байтов. Для надёжного сравнения без учёта регистра для символов с диакритикой или нелатинских символов используйтеmb_stristr()из расширенияmbstring. - Нестроковый
$needle. Начиная с PHP 8.0$needleвсегда трактуется как строка. В более старых версиях нестроковое значение интерпретировалось как код символа ASCII.
Заключение
stristr() возвращает часть строки начиная с первого совпадения без учёта регистра искомой подстроки, либо false, если совпадений нет — а при $before_needle равном true — часть до совпадения. Используйте её, когда нужен найденный текст вне зависимости от регистра; выбирайте stripos() или strpos(), когда нужна только позиция или проверка наличия.