Strpbrk: примеры (PHP)
strpbrk(string haystack, string characters): string|falseФункция strpbrk в PHP
Функция strpbrk выполняет поиск в строке любого символа из заданного набора. Она возвращает часть исходной строки, начиная с первого найденного символа и до конца. Если ни один из символов не найден, функция возвращает false.
Функция применяется, когда необходимо найти первое вхождение любого символа из списка. Типичные сценарии включают поиск разделителей, валидацию строк на наличие недопустимых символов или извлечение подстроки, начинающейся с определённого символа.
Функция принимает два обязательных аргумента:
- string
$string– строка, в которой выполняется поиск. - string
$characters– набор символов для поиска. Поиск чувствителен к регистру.
Примеры использования strpbrk
Поиск первого разделителя в строке.
$text = 'user@example.com';
$result = strpbrk($text, '@.');
var_dump($result);string(15) "@example.com"
Когда ни один из искомых символов отсутствует.
$text = 'Hello World';
$result = strpbrk($text, 'xyz');
var_dump($result);bool(false)
Поиск первого вхождения цифры.
$text = 'Order №123-AB';
$result = strpbrk($text, '0123456789');
var_dump($result);string(4) "123-AB"
Похожие функции в PHP
В PHP существуют другие функции для поиска в строках, которые могут служить альтернативами в зависимости от задачи.
Функция strcspn возвращает длину начального сегмента строки, который не содержит символов из заданного набора. Она полезна для получения части строки до первого найденного символа из набора.
Функция strpos ищет позицию первого вхождения подстроки. Её используют, когда нужно найти конкретную последовательность символов, а не любой символ из набора.
Функция preg_match позволяет выполнять поиск по регулярному выражению. Это наиболее гибкий вариант для сложных условий поиска, но с большими накладными расходами.
Выбор функции: strpbrk оптимальна для простого поиска любого символа из списка с получением остатка строки. strcspn предпочтительнее, если нужна длина части до разделителя. Для поиска сложных паттернов используют preg_match.
Типичные ошибки
Ошибка возникает при проверке результата на равенство без учёта того, что функция возвращает false в случае неудачи.
$result = strpbrk('Hello', 'xyz');
if ($result == false) { // Нестрогое сравнение
echo "Не найдено";
}
// Проблема: строка '0abc' также будет воспринята как falseНе найдено
Использование строгого сравнения решает проблему.
Функция работает с байтами, а не с символами. В многобайтовых кодировках (UTF-8) это может привести к некорректным результатам.
$text = 'привет мир';
$result = strpbrk($text, 'м');
echo $result;// Может вывести некорректную строку
Для многобайтовых строк следует использовать mb_strpbrk или аналоги.
Изменения в последних версиях PHP
В PHP 8.0 были внесены изменения в обработку неверных параметров. Теперь функция вызывает ошибку типа TypeError, если переданы аргументы не строкового типа. Ранее некорректные аргументы приводились к строке, что могло вызывать непредсказуемое поведение.
// PHP 7
var_dump(strpbrk(['array'], 'a')); // Предупреждение и возврат false
// PHP 8
var_dump(strpbrk(['array'], 'a')); // TypeErrorРасширенные примеры
Проверка, содержит ли строка хотя бы один символ из разрешённого набора.
function containsAllowedChars($string, $allowed) {
return strpbrk($string, $allowed) !== false;
}
$password = "Secret123!";
$specialChars = "!@#$%^&*";
if (containsAllowedChars($password, $specialChars)) {
echo "Пароль содержит специальный символ";
}Пароль содержит специальный символ
Последовательное извлечение частей строки по разделителям.
function tokenize($string, $delimiters) {
$tokens = [];
while (($part = strpbrk($string, $delimiters)) !== false) {
$pos = strlen($string) - strlen($part);
$tokens[] = substr($string, 0, $pos);
$string = substr($part, 1);
}
$tokens[] = $string;
return $tokens;
}
$result = tokenize("apple,banana;orange", ",;");
print_r($result);Array
(
[0] => apple
[1] => banana
[2] => orange
)
Извлечение домена из email адреса, начиная с символа '@'.
$email = "user@example.com";
$domainPart = strpbrk($email, "@");
if ($domainPart !== false) {
$domain = substr($domainPart, 1); // Пропускаем символ @
echo $domain; // example.com
}example.com
Аналоги функции в других языках
Strpbrk в Python
В Python нет прямой аналогии, но можно использовать метод find в цикле или модуль re.
import re
text = "user@example.com"
match = re.search(r"[@.]", text)
if match:
result = text[match.start():]
print(result) # @example.com@example.com
Strpbrk в Javascript
В JavaScript используется метод search с регулярным выражением.
let text = 'user@example.com';
let match = text.search(/[@.]/);
let result = match !== -1 ? text.substring(match) : false;
console.log(result); // @example.com@example.com
Strpbrk в MySQL
В MySQL для похожих задач применяют функцию REGEXP_INSTR для поиска позиции и SUBSTRING для извлечения.
SELECT SUBSTRING('user@example.com', REGEXP_INSTR('user@example.com', '[@.]')) AS result;@example.com