php 使用内置的 levenshtein() 函数计算两个字符串的编辑距离,该函数返回将第一个字符串转换为第二个字符串所需的最少单字符编辑操作(插入、删除或替换)次数。调用时传入主串和子串作为参数,若需自定义各操作的代价,可额外传入插入、删除和替换的权重值。

levenshtein() 默认参数下的基本用法
在默认情况下,levenshtein() 函数假设插入、删除和替换操作的代价均为 1。这是最常用的场景,适用于大多数文本相似度比较需求。函数会直接返回一个整数,表示两个字符串之间的最小编辑步数。

<?php $str1 = "kitten"; $str2 = "sitting"; $distance = levenshtein($str1, $str2); echo $distance; // 输出: 3 ?>
上述代码中,kitten 变为 sitting 需要三步:将 'k' 替换为 's',将 'e' 替换为 'i',并在末尾插入 'g'。因此结果为 3。
立即学习“PHP免费学习笔记(深入)”;
自定义插入、删除和替换代价的影响
当业务逻辑对不同类型的编辑操作有不同敏感度时,可以通过第三、第四和第五个参数分别指定插入、删除和替换的代价。例如,在某些拼写检查场景中,替换可能比插入或删除更“昂贵”,或者反之。这些参数必须是非负整数,且至少有一个为正数,否则函数会抛出警告并返回 -1。

<?php $str1 = "cat"; $str2 = "car"; // 插入代价=1, 删除代价=1, 替换代价=5 $distance = levenshtein($str1, $str2, 1, 1, 5); echo $distance; // 输出: 5 ?>
在此例中,虽然只需一次替换即可将 cat 变为 car,但由于替换代价设为 5,而插入/删除代价为 1,算法仍会选择代价最低的路径。实际上,对于 cat 到 car,替换 't' 为 'r' 是唯一最优解,故结果为 5。若改为 cat 到 cut,同样是一次替换,结果也是 5。但如果比较 cat 和 ca,则只需删除 't',代价为 1。
空字符串或相同字符串的返回值是什么
当输入的两个字符串完全相同时,levenshtein() 始终返回 0,因为不需要任何编辑操作。当一个字符串为空而另一个非空时,返回值为非空字符串的长度,因为需要执行相应数量的插入或删除操作才能使其相等。例如,levenshtein("", "abc") 返回 3,levenshtein("abc", "") 也返回 3。若两个字符串均为空,则返回 0。此外,如果任一字符串长度超过 255 个字符,函数将返回 -1 并触发 E_WARNING 错误,这是该函数的一个重要限制条件。



















