PHP Conference Japan 2024

strcspn

(PHP 4, PHP 5, PHP 7, PHP 8)

strcspn查找不匹配掩码的初始段的长度

描述

strcspn(
    string $string,
    string $characters,
    int $offset = 0,
    ?int $length = null
): int

返回string的初始段的长度,该段不包含characters中任何字符。

如果省略offsetlength,则将检查整个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个位置开始检查string

length

要检查的string段的长度。

如果给出length且为非负数,则将从起始位置检查stringlength个字符。

如果给出length且为负数,则将从起始位置检查stringstring末尾的length个字符。

返回值

返回string的初始段的长度,该段完全由characters中*不*包含的字符组成。

注意:

当设置offset参数时,返回的长度是从该位置开始计算的,而不是从string的开头开始计算的。

变更日志

版本 描述
8.4.0 在PHP 8.4.0之前,当characters为空字符串时,搜索将错误地停止在string中的第一个空字节处。
8.0.0 length现在可以为空。

示例

示例 #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)

注释

注意: 此函数是二进制安全的。

参见

  • strspn() - 查找完全由给定掩码中包含的字符组成的字符串初始段的长度

添加注释

用户贡献的注释 5 个注释

12
AT-HE (at_he AT hotmai1 DOT com)
18 年前
此函数可以用作 strspn(),不同之处在于 strspn() 可用于将字符串与允许的模式进行比较,而此函数可用于将字符串与禁止的模式进行比较。

因此,要了解任何禁止的字符是否在我们的字符串中,我们可以使用(未在反斜杠中测试)...

<?php
// 长版本
$forbidden="\"\\?*:/@|<>";
if (
strlen($filename) != strcspn($filename,$forbidden)) {
echo
"你不能创建同名文件!";
}

// 短版本
if (strlen($filename) - strcspn($filename,"\"\\?*:/@|<>")) {
echo
"我告诉你,你不能创建那个文件";
}
?>
9
maskedcoder at hotmail dot com
19年前
用于查找包含HTML的变量中引号和/或标签的开头。
$pos = strcspn($data, '<"\'');
将查找标签的开头或双引号或单引号字符串的第一次出现。
3
legacyprog at routinz dot net
13年前
当使用第三个参数时,请记住该函数将返回它跳过的字符数,这*不*是源字符串中的位置。只需将第三个参数值添加到函数结果即可轻松获得扫描停止的第一个字符串中的位置,但我一开始没想到这一点。
3
匿名
15年前
strcspn()也可以认为类似于以下正则表达式
<?php
// 其中...代表字符掩码
preg_match('/[^ ...]/', substr($subject, $start, $length) );
?>
通过这种类比,strcspn()可以代替某些正则表达式来匹配模式,而无需正则表达式引擎的开销——例如,验证输入字符串是否表示二进制值的方法
<?php
preg_match
('/^[01]+$/i', $subject);
// 或...
!preg_match('/[^01]/i', $subject);

// ...或使用strcspn()
!strcspn($subject, '01');
?>
2
nospam at nospam dot com
8年前
从示例中可能不清楚的是

strcspn('abcdhelloabcd', 'abcd', -9, -5) == 4

因为它只评估'hell',其中不包含任何掩码,所以返回strlen('hell')。
To Top