strspn

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

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

描述

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

查找 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

要检查的字符串。

characters

允许的字符列表。

offset

string 中开始搜索的位置。

如果 offset 给出且为非负,那么 strspn() 将从 offset'th 位置开始检查 string。例如,在字符串 'abcdef' 中,位置 0 中的字符为 'a',位置 2 中的字符为 'c',依此类推。

如果 offset 给出且为负,那么 strspn() 将从 string 末尾的 offset'th 位置开始检查 string

length

string 检查的片段的长度。

如果 length 给出且为非负,那么将在起始位置后检查 stringlength 个字符。

如果 length 给出且为负,那么将从起始位置检查 string,直到 string 末尾的 length 个字符。

返回值

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

注意:

如果设置了 offset 参数,则返回的长度会从该位置开始计数,而不是从 string 的开头开始计数。

变更日志

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

示例

示例 #1 strspn() 示例

<?php
// subject 不以 mask 中的任何字符开头
var_dump(strspn("foo", "o"));

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

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

上述示例将输出

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

提示

提示: 此函数是二进制安全的。

另请参阅

  • strcspn() - 查找与 mask 不匹配的初始片段的长度

添加提示

用户贡献的提示 9 提示

barry dot balkowski at gmail dot com
16 年前
我花了一些时间才理解此函数的工作方式…
我用自己的话编制了自己的解释,与官方解释或者在 Web 上的不同教程中找到的解释相比,我个人觉得它更易于理解。
也许它会为某些人节省几分钟…

<?php
strspn
(string $haystack, string $char_list [, int $start [, int $length]])
?>

工作方式
- 搜索一个由第二个参数的字符组成的一段 $haystack
- $haystack 必须以 $char_list 提供的字符之一开头,否则函数将一无所获
- 一旦函数遇到 $chars 中没有提到的字符,它就会明白这段已结束并停止(它不会搜索第二个、第三个等等段)
- 最后,它测量段的长度并返回它(即长度)

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

<?php

$digits
='0123456789';

if (
strlen($phone) != strspn($phone,$digits))
echo
"illegal characters";

?>
B Crawford
16 年前
此函数的执行速度明显快于等效的 preg_match() 方法,能够检查非法字符。
mrsohailkhan at gmail dot com
13 年前
直接从定义中获取非常困难,当我搜索它时,我了解到

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



strcspn() 的工作方式与此非常相似,不同之处在于它会从头开始向下遍历 str,直到找到一个拒绝集中(即,一个应该被拒绝的字符)的字符。然后它返回到目前为止字符串的长度。

<?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() 的概念。
德米特里·马祖尔
15 年前
第二个参数是要允许的一组字符。
strspn 会返回第一个不允许的字符的从零开始的索引。
example.com 上的 bob
12 年前
检查字符串是否完全由掩码中包含的字符组成的一种快速方法是将 strspn 与 strlen 进行比较,例如

<?php
$path
= $_SERVER['PATH_INFO'];
if (
strspn($path,'/') == strlen($path)) {
//PATH_INFO 为空
}
?>
[email protected]
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
'Time taken for 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
'Time taken for 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
*/
?>
ayaou dot mohammed at gmail dot com
4 年前
此函数不适用于非 ASCII 字符

示例

<?php

$subject
= "Comment ça va ma chérie";
$mask = "éèçà";

echo
strspn($subject,$mask); // 输出 0

?>

看,我们预期的是 1,但 0 才是正确的结果
To Top