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
- string — исследуемая строка.
- characters — строка, содержащая символы для поиска.
- offset — начальная позиция поиска в основной строке. Если отрицательный, отсчет идет от конца строки.
- length — максимальная длина проверяемого фрагмента. Если отрицательный, то указанное количество символов от конца строки игнорируется. Если null, проверка идет до конца строки.
Короткие примеры использования
<?
echo strcspn('abcdef', 'd');
?>3
<?
echo strcspn('hello world', 'wrd');
?>6
<?
echo strcspn('abcdef', 'd', 2);
?>1
<?
echo strcspn('abcdef', 'd', 0, 3);
?>3
<?
echo strcspn('abcdef', 'd', -4);
?>1
Похожие функции в PHP
Функция strspn выполняет обратную операцию — вычисляет длину сегмента, состоящего только из символов указанного набора. Используется, когда необходимо проверить, что начало строки содержит только разрешенные символы.
Функция strpbrk ищет первое вхождение любого символа из набора и возвращает остаток строки, начиная с этого символа. Полезна, когда нужна не позиция, а часть строки.
Регулярные выражения предоставляют более гибкий поиск. Функция preg_match с шаблоном, например, '/[abc]/', позволяет найти позицию первого вхождения, но с большими накладными расходами.
Типичные ошибки
<?
echo strcspn('abc', 'abcdef'); // Ищет символы 'abc' в строке 'abcdef'? Нет!
?>0
Функция не поддерживает флаги, в отличие от некоторых других строковых функций.
<?
echo strcspn('abcdef', 'e', 0, -1); // Проверяет 'abcd'
?>4
Изменения в последних версиях PHP
Типы параметров стали строже. Аргумент length теперь может быть null. Передача неверных типов вызывает TypeError.
Функция получила возможность работать с отрицательными значениями offset и length.
Расширенные примеры
<?
$username = 'user123';
$invalidChars = '!@#';
if (strcspn($username, $invalidChars) === strlen($username)) {
echo 'Имя пользователя корректно';
} else {
echo 'Найден запрещенный символ';
}
?>Имя пользователя корректно
<?
$text = 'Hello\tWorld';
$spaceChars = " \t\n\r\0\x0B";
$firstSpacePos = strcspn($text, $spaceChars);
echo $firstSpacePos;
?>5
<?
$data = 'value1,value2,value3';
$delimiters = ',;';
$firstValueLength = strcspn($data, $delimiters);
$firstValue = substr($data, 0, $firstValueLength);
echo $firstValue;
?>value1
Функция не поддерживает многобайтовые кодировки. Для UTF-8 потребуется преобразование.
<?
$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 могут найти один символ, но не набор. Для набора требуется сложный запрос.