2013-06-04 31 views
4

我想用similar_text()in_array()在PHP中做一個簡單的拼寫檢查和建議程序。 我有一個文本文件dictionary.txt,它是英語中的大部分單詞。PHP的similar_text()和in_array()不工作,因爲它看起來應該是他們應該

首先,我將文本文件中的每個單詞放在一個新行中放入一個數組中。然後在用戶輸入和提交時,我檢查他們輸入的單詞是否在使用in_array()的數組中。如果是,那麼他們拼寫正確。

如果不是,則我使用similar_text()來查找數組中接近拼寫錯誤的單詞的單詞。

我遇到了兩個我一直無法解決的問題,我相信我根據PHP文檔正確使用了in_array()similar_text()

第一個問題是,當用戶鍵入並提交文本文件中的單詞並且也應該在數組中時,其他單詞會引發並且不應該發生。由於它在文本文件中,因此它應該在數組中,並且in_array()應計算爲true。

第二個問題是,我得到一個錯誤,我沒有定義通過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> 
+0

不知道這是不是問題,但你應該強制所有的詞都是上限或下限,並確保你的單詞列表得到同樣的待遇。您也應該從兩個列表中刪除所有標點符號和非單詞字符。 – Orangepill

+1

您不會將'FILE_IGNORE_NEW_LINES'標誌添加到'file()'。 –

+0

@Orangepill手動刪除dictionary.txt中的所有標點符號。爲什麼我會強迫所有上層? dictionary.txt中的單詞都不是大寫。有些,也許15%都是小寫字母。 –

回答

2

更改您加入線,以

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

,改變你輸入到

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

文件命令有留下的壞習慣後面的換行符,所以你可能不匹配的基礎上...修剪應該照顧。其他更改只是爲了使其不區分大小寫。

+0

這是非常真實的,這確實是換行字符 –

+0

謝謝,我從來沒有抓到過。你能幫我多做一件事嗎?它正在給'$ suggestions'數組添加相同的建議多重時間。我試圖通過檢查建議是否在數組中,並且只在不是時才添加它,但似乎沒有起作用,從而阻止它做到這一點。這裏是我添加的代碼:'if($ percentageSimilarity> = 90){if(!in_array($ suggestions)){array_push($ suggestions,$ word); }}爲什麼它多次添加相同的建議? –

+0

我可以看到這種情況發生的唯一原因是,如果多次在字典中有相同的單詞。要清除重複項,可以使用[array_unique](http://php.net/manual/en/function.array-unique.php) – Orangepill

1

當您使用file()時,$words的每個元素仍將附加新行字符。通過應用strtolower(),假設

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

你也可以歸針的所有字典項已經小寫::您可以通過使用FILE_IGNORE_NEW_LINES刪除

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

這是因爲in_array()不匹配不區分大小寫的方式;例如"Hello" != "hello"

進一步的標準化可能包括從您的文字中刪除任何非羅嗦的內容。

+0

+1用於將我指向文件命令的第二個參數。 – Orangepill

相關問題