(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
levenshtein — Calcula a distância Levenshtein entre duas strings
$string1,$string2,$insertion_cost = 1,$replacement_cost = 1,$deletion_cost = 1
A distância Levenshtein é definida como o número mínimo de
caracteres que devem ser substituídos, inseridos ou removidos para transformar
a string1 na string2.
A complexidade do algoritmo é O(m*n),
onde n e m são os
comprimentos da string1 e da
string2 (muito bom quando comparado com
similar_text(), que é O(max(n,m)**3),
mas mesmo assim é custoso).
Se insertion_cost, replacement_cost
e/ou deletion_cost não são iguais a 1,
o algoritmo se adapta para escolher a transformação menos custosa.
Por exemplo, se $insertion_cost + $deletion_cost < $replacement_cost,
nenhuma substituição será feita, mas apenas inserções e remoções.
string1Uma das strings a ser avaliada para a distância Levenshtein.
string2Uma das strings a ser avaliada para a distância Levenshtein.
insertion_costDefine o custo da inserção.
replacement_costDefine o custo da substituição.
deletion_costDefine o custo da remoção.
Eta função retorna a distância Levenshtein entre as duas strings.
| Versão | Descrição |
|---|---|
| 8.0.0 | Antes desta versão, levenshtein() tinha de ser chamada com dois ou com cinco argumentos. |
| 8.0.0 |
Antes desta versão, levenshtein() retornaria -1
se uma das strings fosse maior que 255 caracteres.
|
Exemplo #1 Exemplo de levenshtein()
<?php
// palavra com erro ortográfico
$input = 'abacachi';
// array com palavras para comparação
$words = array('maçã','abacaxi','banana','laranja',
'rabanete','cenoura','ervilha','feijão','batata');
// nenhuma distância mais curta encontrada, ainda
$shortest = -1;
// itera pelas palavras para encontrar a mais próxima
foreach ($words as $word) {
// calcula a distância entre a palavra de entrada
// e a palavra atual
$lev = levenshtein($input, $word);
// verifica se há correspondência exata
if ($lev == 0) {
// a mais próxima é essa (correspondência exata)
$closest = $word;
$shortest = 0;
// sai do loop; já foi encontrada a correspondência exata
break;
}
// se esta distância for menor que a próxima
// OU se se uma próxima palavra mais curta ainda não foi encontrada
if ($lev <= $shortest || $shortest < 0) {
// define a corrspondência mais próxima e a distância mais curta
$closest = $word;
$shortest = $lev;
}
}
echo "Palavra de entrada: $input\n";
if ($shortest == 0) {
echo "Correspondência exata encontrada: $closest\n";
} else {
echo "Você quis dizer: $closest?\n";
}
?>O exemplo acima produzirá:
Palavra de entrada: abacachi Você quis dizer: abacaxi?