2013-02-12 70 views
2

我需要比較可以用多種方式寫入的名稱。例如,像聖托馬斯這樣的名字有時會寫成聖托馬斯或聖托馬斯。最好是,我正在尋求建立一個功能,使比較「平等」的百分比,像一些論壇(這篇文章是5%編輯例如)。PHP比較字符串是否(幾乎)相等

+0

當你不在尋找百分比時,另一個可能性是正則表達式匹配。但要做到這一點,人們必須知道這兩個名字可以有多少不同。 – 2013-02-12 11:58:13

+0

我認爲這是你想要的:http://stackoverflow.com/questions/2285201/php-smart-error-tolerating-string-comparison – fons 2013-02-12 11:58:41

+0

[similar-text](http://www.php.net/manual /de/function.similar-text.php) – bitWorking 2013-02-12 11:58:55

回答

17

PHP有兩個(主要)內置函數。

levenshtein它計算從string1產生string2需要多少次更改(移除/添加/替換)。 (越低越好)

similar_text它返回(越高越好)匹配的字符的數目。請注意,您可以傳遞參考作爲第三個參數,它會給你一個百分比。

<?php 
    $originalPost = "Here's my question to stack overflou. Thanks /h2ooooooo"; 
    $editedPost = "Question to stack overflow."; 
    $matchingCharacters = similar_text($originalPost, $editedPost, $matchingPercentage); 
    var_dump($matchingCharacters); //int(25) 
    var_dump($matchingPercentage); //float(60.975609756098) (hence edited 40%) 
?> 
+0

啊levenshtein函數是完美的!非常感謝,將在6分鐘內接受你的答案:-)。 – dirk 2013-02-12 12:03:48

+1

如果你想要更先進的東西,看看[這篇文章](http://web.archive.org/web/20061007123913/http://www.english.upenn.edu/~jlynch/Computing/compare.html) 。 – gronostaj 2013-02-12 12:07:45

+0

@gronostaj:謝謝......但對於我的應用程序來說,這應該足夠好。性能似乎也可以:-)。 – dirk 2013-02-12 12:12:40

0

您可以使用不同的方法。

您可以使用similar_text()函數來檢查相似性。

OR

可以使用levenshtein()功能,找出...

的Levenshtein距離被定義爲必須更換,插入或刪除字符轉換成STR1 STR2的數量降到最低

然後檢查您的支票的合理閾值。

0
$v1 = 'pupil'; 
$v2 = 'people'; 
# TRUE if $v1 & $v2 have similar pronunciation 
soundex($v1) == soundex($v2); 
# Same but it use a more accurate comparison algorithm     
metaphone($v1) == metaphone($v2);    
# Calculate how many common characters between 2 strings 
# Percent store the percentage of common chars 
$common = similar_text($v1, $v2, $percent);  
# Compute the difference of 2 text             
$diff = levenshtein($v1, $v2); 

所以,要麼levenshtein($v1, $v2)similar_text($v1, $v2, $percent)會爲你做,但仍有權衡levenshtein()算法的複雜度爲O(m*n),其中n和m是v1和v2的長度(與similar_text()相比,相當好,即O(max(n,m)**3),但仍然很昂貴)。