我的PHP搜索表单从MySQL数据库中提取数据。我希望用户有时会在搜索框中填写一个搜索字词,其拼写形式与我的数据库条目略有不同,例如“剧院”而不是“剧院”。我希望这些中只有一些非常常见,所以我在我的数据库表中添加了一行包含这些替代拼写的行,我的PHP搜索表单也会搜索数据库的这一行。它运行良好,但这会在维护数据库时引起很多额外的工作,所以我想知道我的PHP代码中是否可以做些什么来搜索那些预定义的替代拼写(我不是故意给用户建议的拼写,但我希望搜索表单返回,例如,即使用户键入“剧院”,其中也包含“剧院”的条目。是否有一种简单的方法(没有搜索服务器)?
答案 0 :(得分:0)
是的,你可以在没有数据库搜索的情况下轻松完成这项工作,你需要正确的拼写,所以我建议你从PHP编码而不是数据库搜索中完成这项工作......
你可以使用PHP Pspell模块完成这项工作,PHP Pspell像android键盘一样工作,只要在搜索框中使用类型错误拼写,它会自动检查字典中的拼写并使其正确,就像用户键入"剧院"然后用剧院"自动纠正它。
在开始编程之前,你必须检查是否安装了Pspell模块
<?php
$config_dic= pspell_config_create ('en');
这是一个小功能,可以帮助您了解Pspell的工作原理:
<?php
function orthograph($string)
{
// Suggests possible words in case of misspelling
$config_dic = pspell_config_create('en');
// Ignore words under 3 characters
pspell_config_ignore($config_dic, 3);
// Configure the dictionary
pspell_config_mode($config_dic, PSPELL_FAST);
$dictionary = pspell_new_config($config_dic);
// To find out if a replacement has been suggested
$replacement_suggest = false;
$string = explode('', trim(str_replace(',', ' ', $string)));
foreach ($string as $key => $value) {
if(!pspell_check($dictionary, $value)) {
$suggestion = pspell_suggest($dictionary, $value);
// Suggestions are case sensitive. Grab the first one.
if(strtolower($suggestion [0]) != strtolower($value)) {
$string [$key] = $suggestion [0];
$replacement_suggest = true;
}
}
}
if ($replacement_suggest) {
// We have a suggestion, so we return to the data.
return implode('', $string);
} else {
return null;
}
}
要使用此功能,只需传递一个字符串参数:
<?php
$search = $_POST['input'];
$suggestion_spell = orthograph($search);
if ($suggestion_spell) {
echo "Try with this spelling : $suggestion_spell";
}
$dict = pspell_new ("en");
if (!pspell_check ($dict, "lappin")) {
$suggestions = pspell_suggest ($dict, "lappin");
foreach ($suggestions as $suggestion) {
echo "Did you mean: $suggestion?<br />";
}
}
// Suggests possible words in case of misspelling
$config_dic = pspell_config_create('en');
// Ignore words under 3 characters
pspell_config_ignore($config_dic, 3);
// Configure the dictionary
pspell_config_mode($config_dic, PSPELL_FAST);
$dictionary = pspell_new_config($config_dic);
$config_dic = pspell_config_create ('en');
pspell_config_personal($config_dic, 'path / perso.pws');
pspell_config_ignore($config_dic , 2);
pspell_config_mode($config_dic, PSPELL_FAST);
$dic = pspell_new_config($config_dic);
pspell_add_to_personal($dic, "word");
pspell_save_wordlist($dic);
?>