我正在尝试使用similar_text()
和in_array()
在PHP中制作一个简单的拼写检查和建议程序。
我有一个文本文件,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>
答案 0 :(得分:2)
将您的添加更改为
行function addTo($line){
return strtolower(trim($line));
}
并将您的输入更改为
$input = strtolower(trim($_GET['checkSpelling']));
文件命令有一个令人讨厌的习惯,就是留下尾随的换行符,所以你可能根本不匹配...修剪应该处理它。其他变化就是让它不区分大小写。
答案 1 :(得分: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"
。
进一步的标准化可能包括从你的单词中删除任何非罗嗦的东西。