7

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

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

4

5 回答 5

4

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

strspn()是一种方便的替代方法,可以替代逐个字符地挑选字符串,测试字符是否与一组值中的一个匹配。在编写分词器时很有用。替代方案strspn()将是大量重复且容易出错的代码,如下所示:

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

你能发现错误吗?:-)

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

于 2008-12-16T18:08:04.530 回答
1

它基于 ANSI C 函数strspn()。它在没有高级字符串类的低级 C 解析代码中很有用。它在 PHP 中用处不大,它有很多有用的字符串解析函数。

于 2008-12-16T18:02:00.003 回答
1

好吧,据我了解,它与此正则表达式相同:

^[set]*

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

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

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

于 2008-12-16T18:04:47.110 回答
1

I think its great for blacklisting and letting the user know from where the error started. Like MySQL returns part of the query from where the error occured.

Please see this function, that lets the user know which part of his comment is not valid:

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;
于 2012-01-14T11:00:27.443 回答
0

It is useful specificaly for functions like atoi - where you have a string you want to convert to a number, and you don't want to deal with anything that isn't in the set "-.0123456789"

But yes, it has limited use.

-Adam

于 2008-12-16T18:22:13.440 回答