4

PHPで簡単なスペルチェックと提案プログラムを使用similar_text()して作成しようとしています。in_array()私は、英語のほとんどの単語である Dictionary.txt というテキスト ファイルを持っています。

まず、テキスト ファイル内のすべての単語をそれぞれ新しい行に配列に入れます。次に、ユーザーの入力と送信時に、ユーザーが入力した単語が を使用して配列に含まれているかどうかを確認しin_array()ます。もしそうなら、彼らはそれを正しく綴った.

そうでない場合はsimilar_text()、スペルミスのある単語に近い単語を配列内で見つけるために使用します。

解決できなかった 2 つの問題が発生しました。PHP のドキュメントに従って適切に使用in_array()していると思います。similar_text()

最初の問題は、ユーザーがテキスト ファイルにあり、配列にもあるはずの単語を入力して送信すると、else が発生し、それが発生しないことです。これはテキスト ファイルにあるため、配列にある必要があり、in_array()true と評価されるはずです。

2 番目の問題は、2 つの単語間の類似度を保存している変数がsimilar_text()定義されていないというエラーが発生することです。similar_text()ドキュメントのコメントの例と同じように、私はそれを使用しています。実際、$percentageSimilarity各比較の前にリセットと再定義を行っています。定義されていないというエラーが表示されるのはなぜですか?

これが私のコードです:

<?php
function addTo($line){
    return $line;
}
$words = array_map('addTo', file('dictionary.txt'));
if(isset($_GET['checkSpelling'])){
    $input = (string)$_GET['checkSpelling'];
    $suggestions = array();
    if(in_array($input, $words)){
        echo "you spelled the word right!";
    }
    else{
        foreach($words as $word){
            $percentageSimilarity=0.0;
            similar_text($input, $word, $percentageSimilarity);
            if($percentageSimilarity>=95){
                 array_push($suggestions, $word);
            }
         }
         echo "Looks like you spelled that wrong. Here are some suggestions: \n";
         foreach($suggestions as $suggestion){
             echo $suggestion;
         }
     }
  }
  ?>
  <!Doctype HTMl>
 <html lang="en">
     <head>
          <meta charset="utf-8" />
         <title>Spell Check</title>
     </head>
     <body>
         <form method="get">
             <input type="text" name="checkSpelling" autocomplete="off" autofocus />
         </form>
     </body>
 </html>
4

2 に答える 2

3

行への追加を次のように変更します

function addTo($line){
    return strtolower(trim($line));
}

入力を次のように変更します

$input = strtolower(trim($_GET['checkSpelling']));

file コマンドには、末尾の改行文字を残すという厄介な習慣があるため、おそらくそれに基づいて一致していません...トリムはそれを処理する必要があります。他の変更は、大文字と小文字を区別しないようにするためのものです。

于 2013-06-04T05:11:16.887 に答える
1

を使用するfile()と、 の各要素に$wordsは引き続き改行文字が追加されます。次を使用して削除できますFILE_IGNORE_NEW_LINES

$words = file('dictionary.txt', FILE_IGNORE_NEW_LINES);

strtolower()すべての辞書項目がすでに小文字であると仮定すると、 を適用して針を正規化することもできます。

if (!($input = filter_input(INPUT_GET, 'checkSpelling', FILTER_UNSAFE_RAW))) {
    die("Bad input, probably");
}
$input = strtolower($input);

これはin_array()、大文字と小文字を区別しない方法で一致しないためです。例えば"Hello" != "hello"

さらなる正規化には、単語から冗長でないものを削除することが含まれる場合があります。

于 2013-06-04T05:20:57.897 に答える