levenshtein() 是 PHP 中的內建函數,用於確定與兩個字串比較的距離單位,稱為 Levenshtein 距離。編輯距離的定義代表要修改的字元總數,例如替換、插入或刪除輸入字串以將其轉換為另一個字串。
廣告 該類別中的熱門課程 PHP 開發人員 - 專業化 | 8 門課程系列 | 3次模擬測驗開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
PHP 中預設對上述 3 種修改(替換、刪除、插入)賦予相同的權重。但是我們可以選擇透過給出上述可選參數來輸入每個操作的成本或權重。此函數所使用的演算法複雜度為 O(a*b),其中 a 和 b 分別是字串 str1 和 str2 的長度。
此功能有幾點要注意:
這裡我們討論文法和參數:
文法:
levenshtein(str1,str2,insert,replace,delete)
參數:
最後 3 個參數的預設值為 1。
傳回值: 此函數輸出兩個輸入字串之間的編輯距離。如果字串總字元數中的任何一個超過 255,它都會傳回值 -1。
讓我們舉幾個例子來了解 levenshtein 函數的工作原理。
代碼:
<?php // PHP code to determine levenshtein distance // between 2 strings $s1 and $s2 $s1 = 'rdo'; $s2 = 'rst'; print_r(levenshtein($s1, $s2)); ?>
輸出:
這是一個基本範例,其中 2 個輸入字串 s1 和 s2 有一個單詞,每個單字由 3 個不同的字母組成。現在,levenshtein 函數逐個字元比較這兩個字串,並找出字元數的差異。這裡有 2 個字母在 3 個字母中不常見。因此,為了使第一個字串與第二個字串相同,我們需要向其添加 2 個字母“s,t”,因此輸出 2。
代碼:
<?php // PHP code to determine levenshtein distance // between 2 strings $s1 and $s2 $s1 = 'first string'; $s2 = 'second string'; print_r(levenshtein($s1, $s2)); ?>
輸出:
在這個基本範例中,我們可以找出 s1 和 s2 所表示的 2 個輸入字串之間的編輯距離。如果我們比較兩個字串的字符,我們可以看到它們有一個共同的單詞,即“細繩”。而在剩下的單字中,它會在「第一個」和「第二個」單字之間進行比較,並與常用單字「字串」進行比較。這裡唯一不常見的字母是“f,e,c,o,d”和額外的“s”。因此 levenshtein 函數傳回輸出為 6,這表示這 6 個字母是這 2 個輸入字串之間的差異,使用它可以使這 2 個字串在字元方面相等。
代碼:
<?php // PHP code to determine levenshtein distance // between $s1 and $s2 $s1 = 'Common Three Words'; $s2 = 'Common Words'; echo("The Levenshtein distance is: "); print_r(levenshtein($s1, $s2)); ?>
輸出:
在此範例中,我們可以看到第一個字串有 3 個單詞,而第二個字串只有 2 個單字。我們可以注意到第二個字串中的這兩個單字已經出現在第一個字串中。因此,這裡字符的唯一區別是“三”字,它有 5 個字符。這裡需要注意的一個有趣的事情是,輸出給出 6,這意味著即使是額外的空格也被視為一個字元。
<?php // Giving a misspelled word as input $ip = 'giraffee'; // sample set array to compare with $word_list = array('cat','dog','cow','elephant', 'giraffe','eagle','pigeon','parrot','rabbit'); // Since shortest distance is not found yet $short = -1; // Looping through array to find the closest word foreach ($word_list as $word_list) { // Calculating the levenshtein distance between // input word and the current word $levn = levenshtein($ip, $word_list); // To check for the matching word if ($levn == 0) { // This is the closest one which is an perfect match $closest = $word_list; $short = 0; // Here we break from foreach loop // when the exact match is found break; } // When the distance shown here is less than shortest distance // found in next iteration or if the next shortest word is // yet to be found if ($levn <= $short || $short < 0) { // Setting the shortest distance and one having // closest match to the input word $close = $word_list; $short = $levn; } } echo "Input word: $ip\n"; if ($short == 0) { echo "The closest/exact match found to the input word is: $close\n"; } else { echo "Did you mean to spell: $close?\n"; } ?>
輸出:
上面的範例向我們展示了可以實現此 levenshtein 函數的不同情況之一。在這裡,我們透過將拼字錯誤的單字與包含正確單字清單的預定義陣列進行比較來幫助使用者修正拼字錯誤的單字。
所以首先,我們接受使用者輸入的單詞,通常是拼字錯誤的(長頸鹿)。我們正在定義一個正確的動物名稱數組,如圖所示,它也具有輸入單字(長頸鹿)的正確拼寫。 foreach 循環用於迭代數組列表並找到與輸入匹配的最接近的單詞,這是在 levenshtein 函數的幫助下完成的。當找到完全匹配或最接近的匹配時,循環就會中斷。最後,我們將距離與短參數進行比較,如果距離為 0,則表示找到輸入單字的精確匹配,然後將其列印在輸出中。
所以基本上levenshtein函數傳回透過逐個字元比較給定的2個輸入字串所傳回的整數值的距離。前兩個參數是必需的輸入字串,最後 3 個參數是可選的,表示刪除、插入或替換操作的成本。
以上是PHP 編輯 ()的詳細內容。更多資訊請關注PHP中文網其他相關文章!