Yeni projemin arama bölümünde, ziyaretçilerin zaman zaman yanlış kelimeler girdiğini ve bunun sonucunda istedikleri içeriğe ulaşamadıklarını farkettim. Bir arkadaşım “Google’daki gibi Bunu mu demek istediniz? yapsana” diye bir öneride bulundu. “Aa bu benim niye gelmedi ki” diyerek hemen araştırmaya koyuldum.

Kısa bir araştırmadan sonra PHP.net’de Levenshtein algoritması için hazır bir fonksiyon olduğunu gördüm. Bu fonksiyon iki string arasındaki farklılığı bize veriyor. Bize lazım olan bu. Aranan kelime ile elimizdeki içerikleri karşılaştırıp en az farklı olanı ziyaretçiye göstereceğiz. Fonksiyon sayfasında tam da bizim istediğimiz gibi bir kod yazılmış. Aşağıda Google stili Bunu mu demek istediniz? için gerekli kod betiği mevcut.

< ?php
// yanlış yazılmış kelime
$input = 'carrrot';
 
// karşılaştırma yapacağımız kelimeler dizisi
$words  = array('apple','pineapple','banana','orange',
                'radish','carrot','pea','bean','potato');
 
// şuan için bir farklılık yok
$shortest = -1;
 
// en yakın kelimeyi bulmak için döngümüz
foreach ($words as $word) {
 
    // aranan kelime ile elimizdeki kelimeler arasındaki farklılığın hesaplanması
    $lev = levenshtein($input, $word);
 
    // birebir eşleşme var mı kontrolü
    if ($lev == 0) {
 
        // birebir eşleşen kelime
        $closest = $word;
        $shortest = 0;
 
        // tam eşleşen bulduğumuz için döngüden çıkıyoruz
        break;
    }
 
    // farklılık bir sonraki kelimeden azsa
    // ya da bir sonraki en yakın kelime bulunamamışsa
    if ($lev <= $shortest || $shortest < 0) {
        // set the closest match, and shortest distance
        $closest  = $word;
        $shortest = $lev;
    }
}
 
echo "Aranan kelime: $input\n";
 
if ($shortest == 0) {
    echo "Tam eşleşme: $closest\n";
} else {
    echo "Bunu mu demek istediniz?  <u>$closest \n";
}
 
?>

Afiyet olsun.