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!
<?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() - ищет в строке любой символ из заданного набора.
Типичные ошибки
<?php
$str = "Test string";
if (stristr($str, "test") == true) { // Неверно
echo "Найдено";
}
?>Найдено
Функция возвращает строку или false. Строка 'Test string' при приведении к булевому типу дает true, что приводит к некорректной проверке. Правильно использовать строгое сравнение с false.
<?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
// Функция stristr() бинарно-безопасна и работает с многобайтовыми строками,
// но без учета регистра для многобайтовых кодировок (кроме UTF-8, если не используется mb_stristr).
$str = "Привет Мир!";
echo stristr($str, "МИР");
?>Мир!
<?php
// Получение домена из email, игнорируя регистр
function getDomain($email) {
$domain = stristr($email, '@');
return $domain === false ? false : substr($domain, 1);
}
echo getDomain("USER@EXAMPLE.COM");
?>EXAMPLE.COM
<?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
)Аналоги в других языках программирования
Метод 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!
Метод 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!
Функция LOCATE() или оператор LIKE с регистронезависимым сравнением.
SELECT SUBSTRING('Hello World!', LOCATE('world', 'Hello World!')) AS result;World!