PHP匹配拼写错误,数组中的值正确

时间:2015-11-30 18:42:47

标签: php arrays

我不知道在PHP中是否可行,但我想根据用户输入的内容以及输入错误的情况检查数组是否正确。例如,我可以有这样的数组:

$correct_values = array('accounts','users','cheesecake','banana');

如果用户提交了一个字符串,例如acounts(请注意只有一个' c'),那么我想通过$correct_values - 数组,看看是否有类似的东西并返回值 - 在这种情况下return $correct_values[0]。如果用户提交banan,则应返回$correct_values[3]

PHP中是否存在允许我检测到此功能的现有功能?或者我是否需要创建一个包含所有常见错误的$common_typos数组并返回$correct_values的数组键?

2 个答案:

答案 0 :(得分:5)

这基本上是levenshtein($input, $entry)方法的用途。在您的使用案例中,您将遍历$correct_values中的每个条目,计算两个字符串之间的Levenshtein距离,并选择距离最小的那个(如果超过某个值,则不返回任何结果,例如2)。

示例:

/**
 * Returns the closest Levenshtein match
 * @param string $input 
 * @param array $correct_values
 * @param int $threshold
 * @return null|string Either the closest-matching string or null
 */
public function getCloseMatch($input, $correct_values = array(), $threshold = 2) {
    $closest_match = array('value' => null, 'distance' => null);
    foreach($correct_values as $value) {
        $distance = levenshtein($input, $value);
        if($distance === 0) {
            // Great, we got an exact match!
            return $value;
        }

        if($closest_match['distance'] === null || ($distance >= 0 && $distance < $closest_match['distance'])) {
            $closest_match['value'] = $value;
            $closest_match['distance'] = $distance;
        }
    }

    if($closest_match['distance'] === null || $closest_match['value'] === null || $closest_match['distance'] > $threshold) {
        return null;
    } 
    return $closest_match['value'];

}

答案 1 :(得分:0)

查看Hamming distance - 它会为您提供一个数字,说明您需要在搜索字词中更改多少字母以匹配正确的值。然后,您可以选择具有最小汉明距离的正确值。