2017-05-10 4 views
0

strtok()関数を使用して文字列をトークン化し、tokenfalseyの値である可能性があることを理解しているので、ブール値のチェックには===/!==を比較する必要があります。文字列の最後に達したときにstrtok()がfalseを返さないのはなぜですか?

私は壊れた例がここhttps://3v4l.org/u35vL

+1

変数 '$ word'には 'strtolower'の戻り値ではなく、' strtok'ではなく戻り値が割り当てられます。これがエラーかどうかは分かりませんが、 'strtolower'への呼び出しを削除しようとしましたか? –

+0

あなたは正しいですか?しかし、他の誰かが答えとしてあなたのコメントを投稿しました。 – Luke

+0

これは問題ありません。私はPHPプログラマではないと私はエラーを推測したが、原因を知らなかった。答えは、問題と解決の両方に正しく対処します。しかし、コメントのおかげで;) –

答えて

1

可能です

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

falsetokenは私がどこな状況になっていますしかしあなたが」 と言う評価したことがないような状況になっていますがトークンは「」と評価されませんが、返される値は決して 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()