(PHP 4 >= 4.0.1, PHP 5, PHP 7)
levenshtein — Вычисляет расстояние Левенштейна между двумя строками
$str1
, string $str2
)$str1
, string $str2
, int $cost_ins
, int $cost_rep
, int $cost_del
)
Расстояние Левенштейна - это минимальное количество вставок, замен и
удалений символов, необходимое для преобразования
str1
в str2
.
Сложность алгоритма равна O(m*n),
где n и m - длины строк
str1
и str2
(неплохо по
сравнению с similar_text(), имеющей сложность O(max(n,m)**3),
но все же довольно много).
В простейшей форме функция принимает в качестве аргументов две строки
и возвращает минимальное количество вставок, замен и
удалений символов, необходимое для преобразования
str1
в str2
.
Второй вариант принимает три дополнительных аргумента, задающих стоимость операций вставки, замены и удаления. Этот вариант универсальнее первого, но не так эффективен.
str1
Одна из строк, для которых вычисляется расстояние Левенштейна.
str2
Одна из строк, для которых вычисляется расстояние Левенштейна.
cost_ins
Определяет стоимость вставки.
cost_rep
Определяет стоимость замены.
cost_del
Определяет стоимость удаления.
Эта функция возвращает расстояние Левенштейна между двумя строками, или -1, если хотя бы одна из строк длиннее 255 символов.
Пример #1 Пример использования levenshtein()
<?php
// введенное слово с опечаткой
$input = 'carrrot';
// массив сверяемых слов
$words = array('apple','pineapple','banana','orange',
'radish','carrot','pea','bean','potato');
// кратчайшее расстояние пока еще не найдено
$shortest = -1;
// проходим по словам для нахождения самого близкого варианта
foreach ($words as $word) {
// вычисляем расстояние между входным словом и текущим
$lev = levenshtein($input, $word);
// проверяем полное совпадение
if ($lev == 0) {
// это ближайшее слово (точное совпадение)
$closest = $word;
$shortest = 0;
// выходим из цикла - мы нашли точное совпадение
break;
}
// если это расстояние меньше следующего наименьшего расстояния
// ИЛИ если следующее самое короткое слово еще не было найдено
if ($lev <= $shortest || $shortest < 0) {
// set the closest match, and shortest distance
$closest = $word;
$shortest = $lev;
}
}
echo "Вы ввели: $input\n";
if ($shortest == 0) {
echo "Найдено точное совпадение: $closest\n";
} else {
echo "Вы не имели в виду: $closest?\n";
}
?>
Результат выполнения данного примера:
Вы ввели: carrrot Вы не имели в виду: carrot?