什么是strspn?

时间:2008-12-16 17:50:41

标签: php function built-in

今天在工作中,我们试图提出您使用strspn的任何理由。

我搜索了谷歌代码,看看它是否以有用的方式实现,并且显得空白。我无法想象一种情况,我真的需要知道只包含另一个字符串中的字符的字符串的第一段的长度。有什么想法吗?

5 个答案:

答案 0 :(得分:4)

虽然您链接到PHP手册,strspn()函数来自C库,strlen()strcpy()strcmp()等。

strspn()是逐个字符串挑选的便捷替代方法,测试字符是否匹配一组值中的一个。在编写tokenizer时很有用。 strspn()的替代方案将是许多重复且容易出错的代码,如下所示:

for (p = stringbuf; *p; p++) {
  if (*p == 'a' || *p == 'b' || *p = 'c' ... || *p == 'z') {
    /* still parsing current token */
  }
}

你能发现错误吗? : - )

当然,在内置支持正则表达式匹配的语言中,strspn()毫无意义。但是当用C语言为DSL写一个基本的解析器时,它非常漂亮。

答案 1 :(得分:1)

它基于ANSI C函数strspn()。它在低级C语法分析代码中很有用,其中没有高级字符串类。它在PHP中没那么有用,它有很多有用的字符串解析函数。

答案 2 :(得分:1)

我认为它非常适合黑名单并让用户知道错误从何处开始。像MySQL一样,从错误发生的地方返回部分查询。

请参阅此功能,让用户知道他的评论的哪一部分无效:

function blacklistChars($yourComment){

$blacklistedChars = "!@#$%^&*()";
$validLength = strcspn($yourComment, $blacklistedChars);
if ($validLength !== strlen($yourComment))
{

    $error = "Your comment contains invalid chars starting from here: `" . 
        substr($yourComment, (int) '-' . $validLength) . "`";

    return $error;
}

return false;
}

$yourComment = "Hello, why can you not type and $ dollar sign in the text?"; 
$yourCommentError = blacklistChars($yourComment);

if ($yourCommentError <> false)
echo $yourCommentError;

答案 3 :(得分:0)

嗯,根据我的理解,它与这个正则表达式相同:

^[set]*

其中set是包含要找到的字符的字符串。

您可以使用它在字符串的开头搜索任何数字或文本并进行拆分。

将代码移植到php时似乎很有用。

答案 4 :(得分:0)

对于像atoi这样的函数是特别有用的 - 你有一个你想要转换为数字的字符串,而你不想处理那些不在集合中的任何东西“-.0123456789”

但是,它的用途有限。

- 亚当