strpbrk()
Функция strpbrk() в PHP ищет в строке любой из заданного набора символов и возвращает часть строки начиная с первого совпадения.
Введение
Функция strpbrk() в PHP выполняет поиск в строке любого символа из заданного набора и возвращает остаток строки, начиная с первого совпадения. Название расшифровывается как "string pointer break" — функция сканирует строку-стог слева направо и останавливается (прерывается), как только встречает символ, входящий в набор поиска.
Это удобно для задач вроде «верни мне всё начиная с первого @, = или ?» без написания регулярного выражения. В статье рассматриваются синтаксис, возвращаемые значения, распространённая ошибка понимания принципа выбора совпадения и практические сценарии использования.
Синтаксис
strpbrk(string $haystack, string $char_list): string|false| Параметр | Описание |
|---|---|
$haystack | Строка, в которой выполняется поиск. |
$char_list | Строка, перечисляющая искомые символы. Каждый символ обрабатывается отдельно — "abc" означает «любой из a, b или c», а не подстрока "abc". |
Возвращаемое значение: часть $haystack от первого совпавшего символа до конца строки. Если ни один из символов $char_list не найден, возвращается false.
strpbrk() чувствительна к регистру: поиск "A" не совпадёт со строчной a.
Базовый пример
Вывод:
Found 'llo World' in 'Hello World'Это может удивить: результат — llo World, не World. Функция возвращает строку начиная с первого совпавшего символа при сканировании слева направо. Хотя W входит в список поиска, строчная l в «Hello» встречается раньше в строке, поэтому срез начинается с неё. Порядок символов в $char_list не имеет значения — важна только позиция в стоге.
Совпадение определяется позицией, а не порядком в списке
Легко предположить, что strpbrk() учитывает порядок символов, которые вы передаёте. Это не так — функция возвращает строку начиная с того символа из набора, который встречается раньше всего в стоге:
<?php
// 'o' and 'q' are both in the list; 'q' appears first in the haystack.
echo strpbrk("The quick brown fox", "oq"); // quick brown foxВывод:
quick brown foxПрактическое применение: разбивка по разделителю
Поскольку strpbrk() возвращает «всё начиная с разделителя», её можно комбинировать с substr() для извлечения значения после разделителя:
<?php
$pair = "name=John";
$fromEquals = strpbrk($pair, "="); // "=John"
$value = substr($fromEquals, 1); // drop the leading "=" -> "John"
echo $value;Вывод:
JohnФункция также удобна, когда допускается несколько возможных разделителей одновременно:
<?php
$line = "[email protected]";
echo strpbrk($line, "@?#"); // @example.comВывод:
@example.comОбработка случая «не найдено»
Если ни один из перечисленных символов не встречается в стоге, strpbrk() возвращает false. Всегда сравнивайте с помощью строгого оператора !==, чтобы пустой, но валидный результат не был ошибочно принят за неудачу:
<?php
$result = strpbrk("PHP 8.4", "AEIOU"); // uppercase vowels — none present (case-sensitive)
if ($result === false) {
echo "No matching character found.";
} else {
echo $result;
}Вывод:
No matching character found.strpbrk() и связанные функции
| Функция | Ищет | Возвращает |
|---|---|---|
strpbrk() | любой из нескольких символов | остаток строки от первого совпадения или false |
| strpos() | одну подстроку | числовую позицию совпадения или false |
| strstr() | одну подстроку | остаток строки начиная с этой подстроки или false |
| strrchr() | последнее вхождение символа | остаток строки начиная с этой позиции или false |
Используйте strpbrk(), когда у вас есть небольшой набор символов-триггеров и вам нужен хвост строки. Если вы ищете только одну фиксированную подстроку, strstr() или strpos() будут понятнее. Для поиска по шаблону используйте preg_match().
Заключение
strpbrk() возвращает остаток строки начиная с первого символа, совпавшего с любым символом из набора поиска, или false, если совпадения нет. Помните, что совпадение выбирается по позиции в стоге, а не по порядку в списке поиска, и что функция чувствительна к регистру. Это лаконичная альтернатива регулярному выражению, когда нужно получить «всё начиная с первого разделителя».