2013-12-12 40 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

相关问题