PHP中的similar_text()和in_array()似乎无法正常工作

4
我正在尝试在PHP中使用similar_text()in_array()来制作一个简单的拼写检查和建议程序。 我有一个文本文件dictionary.txt,其中包含大部分英语单词。
首先,我将文本文件中的所有单词分别放入一个数组中。然后,在用户输入和提交时,我使用in_array()检查他们输入的单词是否在数组中。如果是,则说明他们拼写正确。
如果不是,则使用similar_text()查找与拼错的单词相近的单词。
我遇到了两个问题,我无法解决,并且我认为我按照PHP文档正确地使用了in_array()similar_text()
第一个问题是,当用户键入并提交应该在文本文件中并且也应该在数组中的单词时,else语句会触发,这不应该发生。由于它在文本文件中,它应该在数组中,并且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>

不知道这是否是问题,但你应该强制使用所有大写或小写字母,并确保您的单词列表得到相同的处理。此外,您还应该从两个列表中删除所有标点符号和非单词字符。 - Orangepill
1
你没有在 file() 函数中添加 FILE_IGNORE_NEW_LINES 标志。 - Ja͢ck
@Orangepill,我手动从dictionary.txt文件中删除了所有标点符号。为什么要强制全大写?dictionary.txt中没有一个单词是全大写的。也许有15%的单词都是小写的。 - Django Johnson
@DjangoJohnson 如果你想进行大小写不敏感的匹配,你应该强制使用全部大写或全部小写。例如,如果你的字典中有"the",而输入却是"The",那么in_array会返回false。将字典和输入都强制转换为相同的大小写可以解决这个问题。 - Orangepill
@Orangepill 那是一个很好的观点,谢谢。 - Django Johnson
2个回答

3
将您的添加行更改为:
function addTo($line){
    return strtolower(trim($line));
}

并将您的输入更改为:
$input = strtolower(trim($_GET['checkSpelling']));

file命令有一个讨厌的习惯,它会保留尾随的换行符,所以你可能无法基于此匹配... 删除空白应该可以解决这个问题。其他更改只是为了不区分大小写。


这是非常正确的,确实是换行符。 - Hanky Panky
谢谢,我从来没有发现过。你能帮我一个忙吗?它会将相同的建议多次添加到$suggestions数组中。我尝试通过检查建议是否在数组中并仅在不存在时添加它来防止它这样做,但似乎不起作用。这是我添加的代码:if($percentageSimilarity>=90){ if(!in_array($suggestions)){ array_push($suggestions, $word); } }为什么会多次添加相同的建议? - Django Johnson
我能想到唯一的原因是你在字典中有多个相同的单词。为了清除重复项,您可以使用array_unique - Orangepill

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"
进一步的规范化可能包括从单词中删除任何非字词字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接