PHP / MySQL包含搜索中的替代拼写

时间:2014-04-07 03:31:44

标签: php mysql

我的PHP搜索表单从MySQL数据库中提取数据。我希望用户有时会在搜索框中填写一个搜索字词,其拼写形式与我的数据库条目略有不同,例如“剧院”而不是“剧院”。我希望这些中只有一些非常常见,所以我在我的数据库表中添加了一行包含这些替代拼写的行,我的PHP搜索表单也会搜索数据库的这一行。它运行良好,但这会在维护数据库时引起很多额外的工作,所以我想知道我的PHP代码中是否可以做些什么来搜索那些预定义的替代拼写(我不是故意给用户建议的拼写,但我希望搜索表单返回,例如,即使用户键入“剧院”,其中也包含“剧院”的条目。是否有一种简单的方法(没有搜索服务器)?

1 个答案:

答案 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);
?>