1

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
name
JavaScript: методы 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
name
MySQL: функция 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