Strstr: примеры (PHP)
Полный обзор функции strstr в PHP с практическими примерами
Раздел: Работа со строками
strstr(string haystack, string needle [, bool before_needle]): string|falseОписание функции strstr
Функция strstr выполняет поиск первого вхождения подстроки в строке. Она возвращает часть исходной строки, начиная с первого найденного вхождения и до конца, или false, если подстрока не обнаружена.
Ситуации использования
Функция применяется для извлечения части строки по известному фрагменту. Например, для получения домена из email-адреса или пути из полного URL.
Аргументы функции
- $haystack (string) – обязательный. Строка, в которой выполняется поиск.
- $needle (string) – обязательный. Искомая подстрока. Если
$needleне является строкой, он преобразуется в целое число и трактуется как код символа. - $before_needle (bool) – необязательный. По умолчанию
false. Если установлен вtrue, функция возвращает часть строки$haystackдо первого вхождения$needle(исключая саму подстроку).
Базовые примеры использования
Поиск и извлечение с конца строки
<?php
$email = "name@example.com";
echo strstr($email, '@');
?>@example.comИспользование параметра before_needle
<?php
$email = "name@example.com";
echo strstr($email, '@', true);
?>nameПоиск по коду символа
<?php
$str = "Hello";
// Поиск символа 'e' (код 101)
var_dump(strstr($str, 101));
?>string(4) "ello"Случай ненахождения подстроки
<?php
$str = "Hello World";
var_dump(strstr($str, 'xyz'));
?>bool(false)Похожие функции в PHP
- stristr() – регистронезависимый аналог
strstr(). Предпочтительна, когда важен поиск без учета регистра. - strchr() – полный синоним
strstr(). - strpos($haystack, $needle) – возвращает позицию первого вхождения. Используется, когда нужна только позиция, а не часть строки. Работает быстрее для проверки наличия подстроки.
- strpbrk($haystack, $char_list) – ищет любой символ из заданного набора в строке и возвращает строку с этого символа.
- preg_match() – используется для сложного поиска по регулярному выражению.
Распространенные ошибки
Сравнение результата с true
<?php
$str = "Hello World";
// Неправильно: результат может быть непустой строкой, которая приводится к true
if (strstr($str, 'Hello')) {
echo "Найдено";
}
// Правильно: явное сравнение с false
if (strstr($str, 'Hello') !== false) {
echo "Найдено";
}
?>Найдено
НайденоПустая искомая строка
<?php
// До PHP 8.0 возвращала исходную строку. Начиная с PHP 8.0 вызывает ошибку.
// var_dump(strstr("Hello", ""));
?>В PHP >=8.0: Fatal error: Uncaught ValueError: strstr(): Argument #2 ($needle) cannot be emptyПоиск числа в строке, содержащей число
<?php
// Число 0 преобразуется в символ с кодом 0 (NULL-байт)
var_dump(strstr("Hello0World", 0));
?>string(6) "0World"Изменения в последних версиях PHP
- PHP 8.0.0: Параметр
$needleтеперь ожидает строку. Передача числа (int) по-прежнему возможно, но передача пустой строки ("") вызываетValueError. Функцияstrstr()больше не возвращаетfalseпри успешном выполнении (непустой результат). - PHP 8.3.0: Класс
IntlDatePatternGeneratorбыл добавлен, но это не относится напрямую кstrstr. Существенных изменений в самой функцииstrstrне было.
Расширенные и специальные примеры
Использование с mbstring для многобайтовых строк
Пример php
<?php
// Для корректной работы с UTF-8 можно использовать mb_strstr
if (function_exists('mb_strstr')) {
$text = "Привет мир";
echo mb_strstr($text, 'мир'); // Без mb_ функция может работать некорректно
}
?>мирИзвлечение пути из URL
Пример php
<?php
$url = "https://example.com/path/to/page";
// Находим начало пути после третьего слэша
$afterProtocol = strstr($url, '//');
if ($afterProtocol !== false) {
$path = strstr(substr($afterProtocol, 2), '/');
echo $path;
}
?>/path/to/pageРазбиение строки на части по разделителю
Пример php
<?php
function splitByFirstOccurrence($string, $delimiter) {
$firstPart = strstr($string, $delimiter, true);
if ($firstPart === false) {
return [$string, ''];
}
$secondPart = substr(strstr($string, $delimiter), strlen($delimiter));
return [$firstPart, $secondPart];
}
print_r(splitByFirstOccurrence('key=value=extra', '='));
?>Array
(
[0] => key
[1] => value=extra
)Обработка вывода до символа перевода строки
Пример php
<?php
$logEntry = "Error 404: Not Found\nDate: 2023-10-01";
$firstLine = strstr($logEntry, "\n", true);
// Если перевода строки нет, вернется вся строка
echo $firstLine !== false ? $firstLine : $logEntry;
?>Error 404: Not FoundПоиск с использованием различных типов данных в needle
Пример php
<?php
// Использование логического типа (преобразуется в 0 или 1)
var_dump(strstr("Hello", true)); // true -> 1, ищет символ с кодом 1 (SOH)
var_dump(strstr("Hello1World", true)); // Находит '1World'
?>bool(false)
string(6) "1World"Аналоги в других языках
Python: метод find() и slicing
text = "name@example.com"
pos = text.find('@')
if pos != -1:
result = text[pos:] # Аналог strstr без третьего аргумента
print(result)
result_before = text[:pos] # Аналог strstr с true
print(result_before)
@example.com
nameJavaScript: методы indexOf() и substring()
let text = "name@example.com";
let pos = text.indexOf('@');
if (pos !== -1) {
let result = text.substring(pos); // Аналог strstr без третьего аргумента
console.log(result);
let resultBefore = text.substring(0, pos); // Аналог strstr с true
console.log(resultBefore);
}
@example.com
nameMySQL: функция SUBSTRING_INDEX()
-- Возвращает часть строки до второго вхождения разделителя
SELECT SUBSTRING_INDEX('www.example.com', '.', 2);
-- Возвращает часть строки после последнего вхождения разделителя
SELECT SUBSTRING_INDEX('www.example.com', '.', -1);
www.example
comОсновное отличие PHP-функции – строгое нахождение первого вхождения заданной подстроки и возможность вернуть часть строки до нее одним вызовом.
PHP strstr function comments
En
Strstr Find the first occurrence of a string