PHP比较字符串是否(几乎)相等

时间:2013-02-12 11:55:40

标签: php

我需要比较可以用多种方式编写的名称。例如,圣托马斯这样的名字有时候就像圣托马斯或圣托马斯一样。最好是,我希望构建一个函数,为比较提供“相等”的百分比,就像某些论坛一样(这篇文章是5%编辑的)。

5 个答案:

答案 0 :(得分:20)

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%)
?>

答案 1 :(得分:2)

两个字符串之间的编辑距离通常是指Levenshtein距离。

http://php.net/manual/en/function.levenshtein.php

答案 2 :(得分:0)

查看levenshtein(),它可以满足您的需求并且相对有效(但效率不高): http://www.php.net/manual/en/function.levenshtein.php

答案 3 :(得分:0)

您可以使用不同的方法。

您可以使用similar_text()功能检查相似性。

OR

您可以使用levenshtein()功能查找...

  

Levenshtein距离定义为您必须替换,插入或删除以将str1转换为str2的最小字符数

然后检查一下合理的检查门槛。

答案 4 :(得分: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),但仍然昂贵)。