2013-12-12 66 views
2

說我有兩個字符串如何在php中檢查兩個字符串的相似性?

$string1 = "Hello my name is Steve and this is spam"; 
$string2 = "Hello my name is Steven and this comment is spam"; 

這兩個字符串是一樣的。

有沒有辦法比較這些,如在if ($string1 like $string2)在PHP?

+7

您可能會發現['similar_text'(http://php.net/similar_text)是有用的。 –

回答

6

您可以使用the levenshtein algorithm來計算相似度索引。據其計算,需要爲第一輸入轉換爲第二或周圍的其他方式改變的字符數:

levenshtein("bar", "baz"); // 1 character difference 
levenshtein("bar", "foo"); // 3 character difference 

$string1 = "Hello my name is Steve and this is spam"; 
$string2 = "Hello my name is Steven and this comment is spam"; 
levenshtein($string1, $string2); // 9 character difference 

@TimCooper還建議similar_text(),其以類似的方式工作。

+0

請您舉個例子嗎? – user3096443

+0

偉大的答案,從來不知道[levenshtein](http://www.php.net/manual/en/function.levenshtein.php)。絕對將來一定會使用它! – celeriko

+0

警告:levenshtein():參數字符串太長 – user3096443

-5

然後對字符串進行散列並比較散列。我認爲這比任何字符串比較函數更快。

原因。字符串比較函數比較每個字符 - 逐字節。哈希函數一次獲取所有字符並生成哈希。

但是,當然你應該使用像md5這樣的「簡單」散列函數。不是專門用於安全散列的hash_pbkdf。這意味着pbkdf計算哈希非常慢,因此atacker在給定時間不能生成如此多的哈希。但那是題外話;-)

或者: 實現此https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm甚至更​​好(快)https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm

+1

這會檢查是否相等,而不是相似性。 – jwueller

+0

儘管存在完全偏離主題的答案,哈希函數(或者至少不是可怕的函數)*也考慮到了每個字符。如果你在維基百科頁面上查看MD5,你會發現[僞代碼](https://en.wikipedia.org/wiki/MD5#Pseudocode)比任何合理的字符串都要更復雜比較功能。那麼世界上怎麼會更快,字符串比較有什麼問題呢? – awksp

相關問題