1

Strcspn: примеры (PHP)

Использование strcspn для поиска символов в PHP
Раздел: Работа со строками
strcspn(string string, string characters [, int offset [, int length]]): int

Функция strcspn в PHP

Назначение и описание

Функция strcspn вычисляет длину начального сегмента строки, который не содержит ни одного символа из указанного списка. Основное применение — поиск позиции первого вхождения любого символа из заданного набора или проверка строки на наличие нежелательных символов в начале.

Аргументы функции

Синтаксис: strcspn(string $string, string $characters, int $offset = 0, ?int $length = null): int

  1. string — исследуемая строка.
  2. characters — строка, содержащая символы для поиска.
  3. offset — начальная позиция поиска в основной строке. Если отрицательный, отсчет идет от конца строки.
  4. length — максимальная длина проверяемого фрагмента. Если отрицательный, то указанное количество символов от конца строки игнорируется. Если null, проверка идет до конца строки.

Короткие примеры использования

Базовое применение
<?
echo strcspn('abcdef', 'd');
?>
3
Несколько символов в наборе
<?
echo strcspn('hello world', 'wrd');
?>
6
Использование offset
<?
echo strcspn('abcdef', 'd', 2);
?>
1
Использование length
<?
echo strcspn('abcdef', 'd', 0, 3);
?>
3
Отрицательный offset
<?
echo strcspn('abcdef', 'd', -4);
?>
1

Похожие функции в PHP

Функция strspn выполняет обратную операцию — вычисляет длину сегмента, состоящего только из символов указанного набора. Используется, когда необходимо проверить, что начало строки содержит только разрешенные символы.

Функция strpbrk ищет первое вхождение любого символа из набора и возвращает остаток строки, начиная с этого символа. Полезна, когда нужна не позиция, а часть строки.

preg_match

Регулярные выражения предоставляют более гибкий поиск. Функция preg_match с шаблоном, например, '/[abc]/', позволяет найти позицию первого вхождения, но с большими накладными расходами.

Типичные ошибки

Перепутаны аргументы string и characters
<?
echo strcspn('abc', 'abcdef'); // Ищет символы 'abc' в строке 'abcdef'? Нет!
?>
0
Использование несуществующих флагов

Функция не поддерживает флаги, в отличие от некоторых других строковых функций.

Некорректная интерпретация отрицательного length
<?
echo strcspn('abcdef', 'e', 0, -1); // Проверяет 'abcd'
?>
4

Изменения в последних версиях PHP

PHP 8.0

Типы параметров стали строже. Аргумент length теперь может быть null. Передача неверных типов вызывает TypeError.

PHP 7.4

Функция получила возможность работать с отрицательными значениями offset и length.

Расширенные примеры

Проверка строки на отсутствие запрещенных символов в начале
Пример php
<?
$username = 'user123';
$invalidChars = '!@#';
if (strcspn($username, $invalidChars) === strlen($username)) {
    echo 'Имя пользователя корректно';
} else {
    echo 'Найден запрещенный символ';
}
?>
Имя пользователя корректно
Поиск позиции первого пробельного символа
Пример php
<?
$text = 'Hello\tWorld';
$spaceChars = " \t\n\r\0\x0B";
$firstSpacePos = strcspn($text, $spaceChars);
echo $firstSpacePos;
?>
5
Извлечение фрагмента до первого разделителя
Пример php
<?
$data = 'value1,value2,value3';
$delimiters = ',;';
$firstValueLength = strcspn($data, $delimiters);
$firstValue = substr($data, 0, $firstValueLength);
echo $firstValue;
?>
value1
Обработка многобайтовых строк

Функция не поддерживает многобайтовые кодировки. Для UTF-8 потребуется преобразование.

Пример php
<?
$text = 'привет мир';
$chars = ' м';
// Неверно для кириллицы:
echo strcspn($text, $chars), '\n';
// Правильно с mb_strlen:
$bytes = strcspn($text, $chars);
$correctPos = mb_strlen(substr($text, 0, $bytes), 'UTF-8');
echo $correctPos;
?>
0
6

Аналоги в других языках

Strcspn в Python

Прямого аналога нет, но можно использовать методы строк и генераторы.

s = 'abcdef'
chars = 'd'
result = len(s) - len(s.lstrip(chars))  # Не эквивалентно!
# Ближайший аналог через поиск:
try:
    result = next(i for i, ch in enumerate(s) if ch in chars)
except StopIteration:
    result = len(s)
print(result)
3

Strcspn в Javascript

Аналогично, прямой функции нет, но можно реализовать через цикл.

let s = 'abcdef';
let chars = 'd';
let result = 0;
while(result < s.length && !chars.includes(s[result])) result++;
console.log(result);
3

Strcspn в MySQL

Функция LOCATE или INSTR могут найти один символ, но не набор. Для набора требуется сложный запрос.

PHP strcspn function comments

En
Strcspn Find length of initial segment not matching mask