strcspn
(PHP 4, PHP 5, PHP 7, PHP 8)
strcspn — 获取不匹配遮罩的起始子字符串的长度
说明
返回 string
中,所有字符都不存在于 characters
范围的起始子字符串的长度。
如果省略 offset
和 length
,则将检查所有的
string
。如果包含前面两个参数,那么跟调用 strcspn(substr($string, $offset, $length),
$characters)
效果相同(参阅 substr 获取更新信息)。
参数
string
-
要检查的字符串。
characters
-
包含每个不允许的字符的字符串。
offset
-
string
开始搜索的位置。如果给出的
offset
是非负数,然后 strcspn() 将会从string
的offset
位置开始检查字符串。例如。在字符串“abcdef
”中,位置为0
的字符是“a
”,位置为2
的字符是“c
”,等等。如果给出的
offset
是负数,则 strcspn() 将会从距离string
末尾的第offset
个位置开始检查字符串。 length
-
要检查的部分
string
的长度。如果给出的
length
是非负数,然后将检查string
中起始位置后的length
字符。If
length
is given and is negative, thenstring
will be examined from the starting position up tolength
characters from the end ofstring
.
返回值
Returns the length of the initial segment of string
which consists entirely of characters not in characters
.
注意:
当设置了
offset
参数时,返回的长度是从该位置开始计算,而不是从string
的开头计算。
更新日志
版本 | 说明 |
---|---|
8.4.0 |
在 PHP 8.4.0 之前,当 characters 为空字符串时,搜索会错误地停止在
string 的第一个 null 字节处。
|
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)
注释
注意: 此函数可安全用于二进制对象。
用户贡献的备注 5 notes
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";
}
?>
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.
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.
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');
?>
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').