【问题标题】:Why doesn't strtok() return false when it reaches the end of the string?为什么 strtok() 到达字符串末尾时不返回 false?
【发布时间】:2017-05-10 08:43:42
【问题描述】:

我正在使用strtok() 函数对字符串进行标记,并了解token 可能是falsey 值,因此必须将其与=== / !== 进行比较以进行布尔检查。

但是我遇到了token 永远不会评估为false 的情况

<?php

$str = "Lorem ipsum dolor sit amet, 0 consectetur adipiscing elit. Donec ullamcorper quam sit amet maximus ornare. Proin dignissim ante eu finibus faucibus. Proin fringilla consequat metus, et imperdiet purus interdum ut. Donec efficitur convallis nisl at luctus. Duis maximus, orci ac congue volutpat, urna nisi dictum nulla, nec auctor tellus libero vel sapien. Nam scelerisque nibh mi, sed posuere libero tincidunt sit amet. Mauris blandit nulla at volutpat dapibus. Donec ac libero sollicitudin, cursus dolor nec, cursus quam.";

$delimiters = " \n\t.,?!;:";

$word = strtolower(strtok($str, $delimiters));

while ($word !== false) {
    echo "|" . $word . "|" . "\n";;
    $word = strtolower(strtok($delimiters));
}

这里有一个损坏的例子https://3v4l.org/u35vL

【问题讨论】:

  • 您将strtolower 的返回值而不是strtok 的返回值分配给变量$word。不确定这是否是错误,但您是否尝试删除对 strtolower 的调用?
  • @terencehill 你是对的,但是其他人已经发布了你的评论作为答案。
  • 没关系。我不是 php 程序员,我只是猜到了错误,但不知道原因。答案正确地解决了问题和解决方案。但是感谢您的评论;)

标签: php string boolean


【解决方案1】:

你说“但是我遇到了令牌永远不会评估为假的情况”,但你从不检查 strtok() 返回的值。相反,您将该值传递给strtolower()

$word = strtolower(strtok($delimiters));

strtolower() 需要一个字符串作为输入。当传递给它的值不是字符串时,它会先转换为字符串。因此,strtok() 返回的 FALSE 值将转换为空字符串 ('') 并传递给 strtolower(),后者将其返回。

strtok() 的正确用法是:

$str = "Lorem ipsum dolor sit amet, 0 consectetur adipiscing elit. Donec ullamcorper quam sit amet maximus ornare. Proin dignissim ante eu finibus faucibus. Proin fringilla consequat metus, et imperdiet purus interdum ut. Donec efficitur convallis nisl at luctus. Duis maximus, orci ac congue volutpat, urna nisi dictum nulla, nec auctor tellus libero vel sapien. Nam scelerisque nibh mi, sed posuere libero tincidunt sit amet. Mauris blandit nulla at volutpat dapibus. Donec ac libero sollicitudin, cursus dolor nec, cursus quam.";

$delimiters = " \n\t.,?!;:";

$word = strtok($str, $delimiters);
while ($word !== false) {
    echo "|" . strtolower($word) . "|" . "\n";
    $word = strtok($delimiters);
}

实现相同结果的另一种方法是使用preg_split()

$pieces = preg_split("/[ \n\t.,?!;:]+/", $str);
foreach ($pieces as $word) {
    echo "|" . strtolower($word) . "|" . "\n";
}

preg_split() 返回一个包含所有单词的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2017-12-14
    • 1970-01-01
    • 2017-12-14
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多