Heim >Backend-Entwicklung >PHP-Tutorial >Zeilenumbruch – [PHP] Warum passiert das, wenn PHP zum Zählen von Wörtern in einem rein englischen Text verwendet wird?
Der Code lautet wie folgt:
<code><?php /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * Created by PhpStorm. * User: Paul * Date: 2016/11/5 * Time: 23:18 */ $content = file_get_contents('4/Gone with the wind.txt'); $res = count_word($content, 1); print_r($res); /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * @param string $string 字符串 * @param int $lower 是否大小写 1:不区分大小写 0:区分大小写 * @return array */ function count_word($string, $lower = 0) { $string = trim($string); if ($lower) { $string = strtolower($string); } //过滤掉一些标点符号 $string = str_replace(';', '', $string); $string = str_replace(',', '', $string); $string = str_replace('.', '', $string); $string = str_replace('.', '', $string); $string = str_replace('‘', '', $string); $string = str_replace('?', '', $string); $string = str_replace('“', '', $string); $string = str_replace('”', '', $string); $string = str_replace('―', '', $string); $string = str_replace('-', '', $string); $string = str_replace('!', '', $string); $string = str_replace(':', '', $string); $string = str_replace('(', '', $string); $string = str_replace(')', '', $string); $array = explode(' ', trim($string)); $res = array(); foreach ($array as $key=>$value) { //过滤掉如I’ll、you’re、masters’s等单词 if (strpos($value, '’') !== false || strpos($value, "'") !== false) { continue; } //过滤掉空 if (empty($value) === true) { continue; } if (array_key_exists($value, $res)) { $res[$value]++; } else { $res[$value] = 1; } } //排序 array_multisort($res, SORT_DESC, SORT_NUMERIC); return $res; }</code>
Ausgabeergebnis:
<code>array( [repression] => 1 [thoroughness] => 1 [bleached] => 1 [tow] => 1 [inspired] => 1 [uniformwell] => 1 [panamas] => 1 [caps when] => 1 )</code>
Ich verstehe nicht, warum zwei Wörter als ein Wort gewertet werden. Der TXT wurde mit Sublime geöffnet und die Kodierung wurde auf UTF-8 eingestellt. Er wurde nicht mit dem mit dem Computer gelieferten Textdokument-Tool geöffnet oder bearbeitet. Außerdem wurden die Satzzeichen gefiltert. Manchmal habe ich auch das Herausfiltern von rn für die Verarbeitung hinzugefügt, aber es hatte keine Auswirkung, sodass der Code entfernt wurde. Finden Sie heraus, warum das passiert und wie Sie es vermeiden können?
Der Code lautet wie folgt:
<code><?php /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * Created by PhpStorm. * User: Paul * Date: 2016/11/5 * Time: 23:18 */ $content = file_get_contents('4/Gone with the wind.txt'); $res = count_word($content, 1); print_r($res); /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * @param string $string 字符串 * @param int $lower 是否大小写 1:不区分大小写 0:区分大小写 * @return array */ function count_word($string, $lower = 0) { $string = trim($string); if ($lower) { $string = strtolower($string); } //过滤掉一些标点符号 $string = str_replace(';', '', $string); $string = str_replace(',', '', $string); $string = str_replace('.', '', $string); $string = str_replace('.', '', $string); $string = str_replace('‘', '', $string); $string = str_replace('?', '', $string); $string = str_replace('“', '', $string); $string = str_replace('”', '', $string); $string = str_replace('―', '', $string); $string = str_replace('-', '', $string); $string = str_replace('!', '', $string); $string = str_replace(':', '', $string); $string = str_replace('(', '', $string); $string = str_replace(')', '', $string); $array = explode(' ', trim($string)); $res = array(); foreach ($array as $key=>$value) { //过滤掉如I’ll、you’re、masters’s等单词 if (strpos($value, '’') !== false || strpos($value, "'") !== false) { continue; } //过滤掉空 if (empty($value) === true) { continue; } if (array_key_exists($value, $res)) { $res[$value]++; } else { $res[$value] = 1; } } //排序 array_multisort($res, SORT_DESC, SORT_NUMERIC); return $res; }</code>
Ausgabeergebnis:
<code>array( [repression] => 1 [thoroughness] => 1 [bleached] => 1 [tow] => 1 [inspired] => 1 [uniformwell] => 1 [panamas] => 1 [caps when] => 1 )</code>
Ich verstehe nicht, warum zwei Wörter als ein Wort gewertet werden. Der TXT wurde mit Sublime geöffnet und die Kodierung wurde auf UTF-8 eingestellt. Er wurde nicht mit dem mit dem Computer gelieferten Textdokument-Tool geöffnet oder bearbeitet. Außerdem wurden die Satzzeichen gefiltert. Manchmal habe ich auch das Herausfiltern von rn für die Verarbeitung hinzugefügt, aber es hatte keine Auswirkung, sodass der Code entfernt wurde. Finden Sie heraus, warum das passiert und wie Sie es vermeiden können?
Ihr Problem sollte darin bestehen, dass Zeilenvorschübe (und Wagenrückläufe) nicht verarbeitet werden und diese Filterzeichen durch '' ersetzt werden, das durch ''
ersetzt werden sollte<code class="php"><?php $content = file_get_contents(__FILE__); //没有你的原始文本, 所以就直接读取文件自身作为样本了 $res = count_word($content, 1); print_r($res); /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * @param string $string 字符串 * @param int $lower 是否大小写 1:不区分大小写 0:区分大小写 * @return array */ function count_word($string, $lower = 0) { $string = trim($string); if ($lower) { $string = strtolower($string); } //过滤掉一些标点符号 $string = str_replace([';',',','.','.','‘','?','“','”','―','-','!',':','(',')',"\r","\n"], ' ', $string); $array = explode(' ', $string); $res = array(); foreach ($array as $key=>$value) { //过滤掉空 if (!$value) { continue; } //过滤掉如I’ll、you’re、masters’s等单词 if (strpos($value, '’') !== false || strpos($value, "'") !== false) { continue; } if (array_key_exists($value, $res)) { $res[$value]++; } else { $res[$value] = 1; } } //排序 array_multisort($res, SORT_DESC, SORT_NUMERIC); return $res; }</code>
Ich weiß nicht, wie die Zeichenfolge in Ihrer Datei aussieht, aber die Funktion trim
entfernt nur Leerzeichen auf beiden Seiten (rn
), daher denke ich, dass das Problem hier liegt.