我正忙着为一些小学教育学生建立一个ELO.
ELO中的一些问题是"开放的",因此学生应该在文本框中输入答案.
假设有一个问题,正确的答案是"扫描仪".一名学生写错字并键入"scaner".我不想将此答案标记为不正确.
所以我想知道PHP中是否存在运算符'类似',与LIKE
MariaDb Sql中的运算符'或者数学中的双'代字号'相同.
我很确定我的"问题"有解决方法,但我只是渴望学习.
看一下这个:
http://php.net/manual/en/function.levenshtein.php
对于这种确切的情况,Levenshtein算法是伟大的.它适用于拼写错误或大脑屁时刻,例如输入"blew"而不是"blue",名字等.
Levenshtein将返回一个数字.这个数字表示两个单词之间的"距离".我在你的场景中做的是用一个小数字,比如2或3来做最大距离.这样,如果只需要一个字符校正,那就没问题了.但是,如果单词是"Scanner",并且他们输入"Skammer",它实际上不会将其作为有效响应传递.
这里有一些例子:
"; }
以上将输出以下内容:
0 1 1 3 4 2
因此,您可以看到密切相关的单词与不那么紧密相关的单词之间的相关性.所以,有了上面的阈值,如果我们改变我们的代码,我们可以这样做:
"; else echo "$word is NOT close enough to $match!
"; }
我们会得到这样的回复:
Scanner is close enough to Scanner! Scaner is close enough to Scanner! Skanner is close enough to Scanner! Skammer is NOT close enough to Scanner! Clammer is NOT close enough to Scanner! Skaner is close enough to Scanner!
注意"Clammer"与"Scanner"的距离是4.让我解释一下.该距离是为了使单词匹配而必须更改的字符数量.所以,"C"必须改变,"L"必须改变,两个"M"都必须改变.因此,得分为4.
使用它时,请考虑"S"和"s"是两个完全不同的字符,所以它绝对区分大小写.我会让它不区分大小写,以确保像"ScAnNeR"这样的东西不会被标记为错误的答案.像这样:
"; else echo "$word is NOT close enough to $match!
"; }
谨慎的话
我强烈建议不要依赖soundex()
.看看这个例子:
"; else echo "$word is NOT close enough to $match!
"; echo soundex($word) . "/" . soundex($match) . "
"; }
这个例子给出了这个结果:
spectacular is NOT close enough to spectacle! S123/S123 spectacle is close enough to spectacle! S123/S123
两个完全不同的单词,甚至听起来都不一样,根据它们,它们将是一个完美的匹配soundex()
!虽然我认为它对某些应用程序来说是一个有用的功能,但它对于这种应用程序来说还不是一个很好的解决方案.这是另一个例子:
"; else echo "$word is NOT close enough to $match!
"; echo soundex($word) . "/" . soundex($match) . "
"; }
输出:
clancy is close enough to clancy! C452/C452 klancy is close enough to clancy! K452/C452
底线:不要依赖soundex()
这种应用.你最终只会与它战斗并在此过程中被烧毁.