useful for finding beginning of quotes and/or tags in a variable containing html.
$pos = strcspn($data, '<"\'');
will find the first occurance of either the beginning of a tag, or a double- or single-quoted string.
(PHP 4, PHP 5, PHP 7, PHP 8)
strcspn — Находит длину начального фрагмента строки, который не соответствует маске
Функция возвращает длину начального фрагмента строки string
,
который не содержит ни одного символа из строки
characters
.
Функция проверит всю строку string
,
если аргументы offset
и length
не передали.
Эффект будет аналогичным вызову
strcspn(substr($string, $offset, $length), $characters)
,
если аргументы передали.
Дополнительную информацию даёт описание функции substr.
string
Строка, которую требуется проверить.
characters
Строка с запрещёнными символами.
offset
Позиция в строке string
, с которой требуется начать поиск.
Функция strcspn() начнёт проверку строки
string
с позиции смещения offset
,
если в параметр offset
передали неотрицательное значение.
Например: в строке "abcdef
" в позиции 0
стоит символ "a
", в позиции 2
— символ "c
"
и так далее.
Функция strspn() начнёт проверку строки string
с позиции смещения offset
с конца строки string
,
если в параметр offset
отрицательное значение.
length
Фрагмент какой длины требуется проверить в строке string
.
Функция проверит в строке string
столько символов с позиции смещения и до конца строки,
сколько указали в аргументе length
,
если в параметр length
передали неотрицательное значение.
Функция проверит в строке string
столько символов с позиции смещения и до начала строки,
сколько указали в аргументе length
,
если в параметр length
передали отрицательное значение.
Функция возвращает длину начального фрагмента строки string
,
которая состоит только из символов, которые не содержатся
в аргументе characters
.
Замечание:
При установке параметра
offset
функция возвращает и отсчитывает длину фрагмента с позиции смещения, а не с начала строкиstring
.
Версия | Описание |
---|---|
8.4.0 |
До PHP 8.4.0 при передаче в параметр characters
пустой строки поиск ошибочно останавливался на первом NUL-байте
в аргументе string .
|
8.0.0 |
Параметр length теперь принимает значение null .
|
Пример #1 Пример поиска функцией strcspn() длины начального фрагмента строки, который не совпадает с маской
<?php
$a = strcspn('banana', 'a');
$b = strcspn('banana', 'abcd');
$c = strcspn('banana', 'z');
$d = strcspn('abcdhelloabcd', 'a', -9);
$e = strcspn('abcdhelloabcd', 'a', -9, -5);
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
var_dump($e);
?>
Результат выполнения приведённого примера:
int(1) int(0) int(6) int(5) int(4)
Замечание: Функция безопасна для обработки данных в двоичной форме.
useful for finding beginning of quotes and/or tags in a variable containing html.
$pos = strcspn($data, '<"\'');
will find the first occurance of either the beginning of a tag, or a double- or single-quoted string.
this function can be used like strspn(), except while that can be used to compare a string with an allowed pattern, this one can be use to compare a string with a FORBIDDEN pattern
so, to know if any forbidden character has a position inside our string, we can use (not tested with backslashes)...
<?php
// LARGE VERSION
$forbidden="\"\\?*:/@|<>";
if (strlen($filename) != strcspn($filename,$forbidden)) {
echo "you cant create a file with that name!";
}
// SHORT VERSION
if (strlen($filename) - strcspn($filename,"\"\\?*:/@|<>")) {
echo "i told you, you cant create that file";
}
?>
When you use the third parameter remember that the function will return the number of characters it bypassed, which will *not* be the position in your source string. It's a simple fix to just add your third parameter value to the function result to get the position in the first string where the scan stopped, but I didn't think of it at first.
It might not be clear from the example, that
strcspn('abcdhelloabcd', 'abcd', -9, -5) == 4
because it's only evaluating 'hell' which doesn't contain any mask, so returns strlen('hell').
strcspn() can also be thought of as analogous to the following regular expression:
<?php
// where ... represents the mask of characters
preg_match('/[^ ...]/', substr($subject, $start, $length) );
?>
By this analogy, strcspn() can be used in place of some regular expressions to match a pattern without the overhead of a regex engine -- for example, ways to verify if an input string represents a binary value:
<?php
preg_match('/^[01]+$/i', $subject);
// or...
!preg_match('/[^01]/i', $subject);
// ...or using strcspn()
!strcspn($subject, '01');
?>