grapheme_levenshtein în PHP

Șiruri de caractere PHP 8.5+ (extensia intl)

Distanța Levenshtein dintre două texte, numărată pe caractere vizibile (grafeme), corectă pentru diacritice și emoji.

Sintaxă
grapheme_levenshtein(string $string1, string $string2, int $insertion_cost = 1, int $replacement_cost = 1, int $deletion_cost = 1, string $locale = ""): int|false

Ce face grapheme_levenshtein

Distanța Levenshtein spune câte modificări (inserări, ștergeri, înlocuiri) transformă un text în altul. levenshtein() numără octeți, așa că o literă cu diacritice (2 octeți în UTF-8) poate conta ca două modificări.

grapheme_levenshtein numără grafeme, adică ce vede omul ca un caracter. Este potrivită pentru sugestii „ai vrut să scrii…?” pe text românesc.

Parametri

Parametru Descriere
$string1, $string2 Textele comparate (UTF-8).
$insertion_cost, $replacement_cost, $deletion_cost Costul fiecărei operații (implicit 1).
$locale Opțional. Regiunea folosită la compararea caracterelor.

Ce returnează

Numărul de modificări (int), sau false la eroare.

Exemple

Exemplul 1: Diacritice: octeți față de grafeme

<?php
echo levenshtein("mașină", "masina") . " (levenshtein, pe octeți)\n";
echo grapheme_levenshtein("mașină", "masina") . " (grapheme_levenshtein)";

Rezultat

4 (levenshtein, pe octeți)
2 (grapheme_levenshtein)

Exemplul 2: Sugestie pentru un oraș scris greșit

<?php
$orase = ["Iași", "Brașov", "Timișoara", "Constanța"];
$cautat = "Brasov";

$distante = [];
foreach ($orase as $oras) {
    $distante[$oras] = grapheme_levenshtein(mb_strtolower($cautat), mb_strtolower($oras));
}
asort($distante);

echo "Ai vrut să scrii " . array_key_first($distante) . "?";

Rezultat

Ai vrut să scrii Brașov?

Greșeli frecvente

  • Compari texte cu litere mari și mici amestecate: „Iași” și „iași” sunt la distanța 1. Folosește mb_strtolower pe ambele.
  • Folosești funcția pe PHP 8.4 sau mai vechi: există doar din PHP 8.5.

Comenzi înrudite

  • levenshtein: Calculează câte modificări de caractere sunt necesare ca un text să devină altul (distanța Levenshtein).
  • similar_text: Calculează cât de asemănătoare sunt două texte, ca număr de caractere comune și ca procent.
  • grapheme_str_split: Împarte un text în caractere așa cum le vede omul (grafeme), inclusiv emoji compuse și litere cu semne separate.
  • soundex / metaphone: Calculează o cheie fonetică: cuvintele care se pronunță asemănător (în engleză) primesc aceeași cheie.