当前位置: 首页> 最新文章列表> 怎么用 levenshtein 函数做模糊搜索?PHP 实现近似匹配的技巧

怎么用 levenshtein 函数做模糊搜索?PHP 实现近似匹配的技巧

gitbox 2025-06-09

在进行文本匹配、搜索时,很多时候我们不仅需要精确匹配,还需要一种方法来识别那些与目标文本“相近”的字符串。PHP 提供了一个非常方便的函数 levenshtein,可以帮助我们实现这一目标,进行模糊搜索。今天,我们将详细介绍如何用 levenshtein 函数进行模糊搜索,并通过 PHP 实现近似匹配。

什么是 Levenshtein 距离?

Levenshtein 距离(也叫编辑距离)是衡量两个字符串之间的差异的指标。它表示通过最少的编辑操作(插入、删除、替换)将一个字符串转换为另一个字符串所需的步骤数。Levenshtein 距离越小,表示两个字符串越相似。

PHP 中的 Levenshtein 函数

在 PHP 中,我们可以使用 levenshtein 函数来计算两个字符串之间的 Levenshtein 距离。它的基本语法如下:

levenshtein(string $str1, string $str2, int $cost_ins = 1, int $cost_rep = 1, int $cost_del = 1): int
  • $str1$str2 是要比较的两个字符串。

  • $cost_ins 是插入字符的代价,默认为 1。

  • $cost_rep 是替换字符的代价,默认为 1。

  • $cost_del 是删除字符的代价,默认为 1。

  • 返回值是两个字符串之间的 Levenshtein 距离。

通过计算 Levenshtein 距离,我们就可以判断两个字符串的相似度。距离越小,表示越相似。

通过 Levenshtein 函数进行模糊搜索

在实际应用中,我们通常会在搜索某个关键词时,提供一个“模糊搜索”的功能。也就是说,我们希望能够找到那些与用户输入的搜索词相似的内容,而不仅仅是完全匹配的结果。

1. 实现基本的模糊搜索

假设我们有一个包含多个字符串的数组,现在需要根据用户输入的关键词来找到那些与之相似的字符串。我们可以通过遍历数组,对每个字符串与搜索词计算 Levenshtein 距离,选择那些距离较小的结果。

<?php
$searchTerm = 'apple';  // 用户输入的搜索词
$items = ['apple pie', 'apple', 'banana', 'grape', 'apricot'];

$threshold = 3;  // 设置一个最大距离阈值,越小越严格
$results = [];

foreach ($items as $item) {
    $distance = levenshtein($searchTerm, $item);
    if ($distance <= $threshold) {
        $results[] = $item;  // 如果距离小于阈值,则认为是模糊匹配
    }
}

print_r($results);
?>

在这个例子中,我们计算了搜索词 apple 和数组中每个元素之间的 Levenshtein 距离。如果距离小于或等于设定的阈值(如 3),就认为该项与搜索词相似,加入到结果数组中。

输出的结果可能是:

Array
(
    [0] => apple pie
    [1] => apple
)

2. 实现带有排序的模糊搜索

有时候,我们可能不仅仅需要找到所有的相似项,还希望根据相似度来排序,优先展示那些最为相似的结果。我们可以通过对计算得到的 Levenshtein 距离进行排序来实现这一点。

<?php
$searchTerm = 'apple';  // 用户输入的搜索词
$items = ['apple pie', 'apple', 'banana', 'grape', 'apricot'];

$results = [];

foreach ($items as $item) {
    $distance = levenshtein($searchTerm, $item);
    $results[] = ['item' => $item, 'distance' => $distance];
}

// 按照距离进行升序排序
usort($results, function ($a, $b) {
    return $a['distance'] - $b['distance'];
});

print_r($results);
?>

在这个例子中,我们首先计算每个字符串与搜索词的 Levenshtein 距离,然后将它们放入一个关联数组中。使用 usort 函数对结果按照距离进行排序,最小距离的项会排在前面。

输出结果:

Array
(
    [0] => Array
        (
            [item] => apple
            [distance] => 0
        )

    [1] => Array
        (
            [item] => apple pie
            [distance] => 4
        )

    [2] => Array
        (
            [item] => apricot
            [distance] => 5
        )

    [3] => Array
        (
            [item] => banana
            [distance] => 6
        )

    [4] => Array
        (
            [item] => grape
            [distance] => 6
        )
)

可以看到,距离为 0 的 apple 被排在最前面,接下来是与搜索词最相似的项。

3. 使用 URL 进行查询

假设我们需要将搜索结果中的某些内容与 URL 相关联,我们可以直接在字符串中嵌入相关的 URL。下面是一个示例:

<?php
$searchTerm = 'apple';  // 用户输入的搜索词
$items = ['apple pie', 'apple', 'banana', 'grape', 'apricot'];
$baseUrl = 'http://gitbox.net/search?query=';

$results = [];

foreach ($items as $item) {
    $distance = levenshtein($searchTerm, $item);
    if ($distance <= 3) {
        $results[] = [
            'item' => $item,
            'url'  => $baseUrl . urlencode($item)  // 将匹配的项与 URL 进行拼接
        ];
    }
}

print_r($results);
?>

在此例中,搜索结果不仅包含匹配项本身,还为每个匹配项生成了一个 URL,指向一个可能的搜索页面。

输出示例:

Array
(
    [0] => Array
        (
            [item] => apple pie
            [url] => http://gitbox.net/search?query=apple+pie
        )

    [1] => Array
        (
            [item] => apple
            [url] => http://gitbox.net/search?query=apple
        )
)

总结

通过 levenshtein 函数,我们可以非常容易地实现模糊搜索功能。无论是简单的匹配,还是排序后的匹配,Levenshtein 距离都能帮助我们判断字符串之间的相似度。结合实际需求,我们还可以将模糊匹配与 URL 相关联,进一步优化搜索体验。希望这篇文章能帮助你更好地理解和使用 PHP 的 levenshtein 函数,提升你的搜索功能的灵活性和准确性。