PHP 大会日本 2024

strspn

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

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

描述

strspn(
    字符串 $string,
    字符串 $characters,
    整数 $offset = 0,
    ?整数 $length = null
): 整数

查找string的初始段的长度,该初始段仅包含characters中的字符。

如果省略了offsetlength,则将检查整个string。如果包含它们,则效果将与调用strspn(substr($string, $offset, $length), $characters)相同(有关更多信息,请参见substr)。

代码行

<?php
$var
= strspn("42 is the answer to the 128th question.", "1234567890");
?>
2赋值给$var,因为字符串“42”是string的初始段,该段仅包含“1234567890”中的字符。

参数

字符串

要检查的字符串。

字符

允许的字符列表。

偏移量

string中开始搜索的位置。

如果提供了offset并且是非负数,则strspn()将从string的第offset个位置开始检查。例如,在字符串'abcdef'中,位置0处的字符是'a',位置2处的字符是'c',依此类推。

如果提供了offset并且是负数,则strspn()将从string末尾的第offset个位置开始检查string

长度

要检查的string段的长度。

如果提供了length并且是非负数,则在起始位置之后将检查stringlength个字符。

如果提供了length并且是负数,则将从起始位置检查string,直到string末尾的length个字符。

返回值

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

注意:

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

变更日志

版本 描述
8.0.0 length现在可以为 null。

示例

示例 #1 strspn() 示例

<?php
// 主题没有以掩码中的任何字符开头
var_dump(strspn("foo", "o"));

// 从偏移量 1 开始检查主题中的两个字符
var_dump(strspn("foo", "o", 1, 2));

// 从偏移量 1 开始检查主题中的一个字符
var_dump(strspn("foo", "o", 1, 1));
?>

以上示例将输出

int(0)
int(2)
int(1)

注释

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

参见

  • strcspn() - 查找不匹配掩码的初始段的长度

添加注释

用户贡献的注释 8 条注释

barry dot balkowski at gmail dot com
16 年前
我花了一些时间才理解这个函数的工作方式……
我用我自己的话汇编了我的解释,对我个人来说,它比官方的解释或网络上不同教程中的解释更容易理解。
也许,它可以为某人节省几分钟……

<?php
strspn
(字符串 $haystack, 字符串 $char_list [, 整数 $start [, 整数 $length]])
?>

工作原理
- 搜索 $haystack 的一个片段,该片段完全由通过第二个参数提供的字符组成
- $haystack 必须以通过 $char_list 提供的其中一个字符开头,否则函数将找不到任何内容
- 一旦函数遇到 $chars 中未提及的字符,它就会理解该片段已结束并停止(它不会搜索第二个、第三个等片段)
- 最后,它测量该片段的长度并返回它(即长度)

换句话说,它在字符串中找到一个跨度(仅第一个),该跨度完全由 $chars_list 中提供的字符组成,并返回其长度
AT-HE (at_he.hotmail)
14 年前
您可以将此函数与 strlen 一起使用来检查非法字符,字符串长度必须与 strspn 相同(我的字符串中包含在另一个字符串中的字符)

<?php

$digits
='0123456789';

if (
strlen($phone) != strspn($phone,$digits))
echo
"非法字符";

?>
B Crawford
17 年前
此函数在检查非法字符方面比等效的 preg_match() 方法快得多。
mrsohailkhan at gmail dot com
13 年前
很难直接从定义中获取,在我搜索时,我了解到

strspn() 将告诉您完全由 accept 集中字符组成的字符串的长度。也就是说,它开始沿着 str 遍历,直到找到一个不在该集合中的字符(即,一个不被接受的字符),并返回到目前为止字符串的长度。

以及

strcspn() 的工作方式大致相同,只是它沿着 str 遍历,直到找到 reject 集中的一个字符(即,一个要拒绝的字符)。然后它返回到目前为止字符串的长度。

<?php
$acceptSet
= "aeiou";
$rejectSet = "y";

$str1 ="a banana";
$str2 ="the bolivian navy on manuvers in the south pacific";

echo
$n = strspn($str1,$acceptSet);// $n == 1, 仅 "a"

echo $n = strcspn($str2,$rejectSet);// n = 16, "the bolivian nav"
?>

希望此示例有助于理解 strspn() 和 strcspn() 的概念。
Dmitry Mazur
15 年前
第二个参数是一组允许的字符。
strspn 将返回第一个不允许字符的从零开始的索引。
bob at example dot com
12 年前
检查字符串是否完全由掩码中的字符组成的一种快速方法是将 strspn 与 strlen 进行比较,例如

<?php
$path
= $_SERVER['PATH_INFO'];
if (
strspn($path,'/') == strlen($path)) {
//PATH_INFO 为空
}
?>
lincoln dot mahmud at gmail dot com
4 年前
获取组匹配字母

<?php

$s
= 'aaabbbcceeffaaeeeaaabbzmmm';

function
groupby( $s ){
static
$a = [];
static
$i = 0;

$o = strspn( $s, $s[$i], $i);
$a[ $i ] = [ $s[$i] => $o ];
$i += $o;

if(
$i < strlen($s) ) {
groupby($s);
}

return
$a;
}

print_r(groupby($s));

?>
nino dot skopac at gmail dot com
6 年前
strspon 和 preg_match 在验证数字方面似乎一样快

<?php

$testValInvalid
= 'foobar123^^';
$testValValid = '12346';
$allowedChars = '1234567890';

$t1 = microtime(true);
for (
$i = 0; $i < 1000000; $i++) {
assert(strspn($testValInvalid, $allowedChars) != strlen($testValInvalid));
assert(strspn($testValValid, $allowedChars) == strlen($testValValid));
}
print
'strspon 消耗时间: ' . (microtime(true) - $t1);
print
PHP_EOL;

$t1 = microtime(true);
for (
$i = 0; $i < 1000000; $i++) {
assert(preg_match('/^[0-9]+$/', $testValInvalid) === 0);
assert(preg_match('/^[0-9]+$/', $testValValid));
}

print
'preg_match 消耗时间: ' . (microtime(true) - $t1);
print
PHP_EOL;

/**
nino-mcb:hosp_web ninoskopac$ php test.php
Time taken for strspon: 3.24165391922
Time taken for preg_match: 3.1820080280304
nino-mcb:hosp_web ninoskopac$ php test.php
Time taken for strspon: 3.1806418895721
Time taken for preg_match: 3.2244551181793
*/
?>
To Top