为什么strtok()在到达字符串末尾时不返回false?

时间:2017-05-10 08:43:42

标签: php string boolean

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

但是我遇到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

1 个答案:

答案 0 :(得分:1)

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

using (var archive = System.IO.Compression.ZipFile.Open(filePath, ZipArchiveMode.Read))
{
    var count = archive.Entries.Count(x => !string.IsNullOrWhiteSpace(x.Name));
}

$word = strtolower(strtok($delimiters)); 期望一个字符串作为输入。当传递给它的值不是字符串时,它会先转换为字符串。因此,strtolower()返回的FALSE值将转换为空字符串(strtok())并传递给返回的''

strtolower()的正确用法是:

strtok()

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

$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);
}

$pieces = preg_split("/[ \n\t.,?!;:]+/", $str); foreach ($pieces as $word) { echo "|" . strtolower($word) . "|" . "\n"; } 返回一个包含所有单词的数组。