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

4

我需要比较可以用几种方式书写的名称。例如,像St. Thomas这样的名字有时会被写成St-Thomas或Sant Thomas。最好是建立一个函数,给出比较的“相等程度”百分比,就像一些论坛所做的那样(例如,“此帖子已编辑5%”)。


当您不寻找百分比时,另一个可能性是正则表达式匹配。但是要做到这一点,必须知道两个名称之间有多大的差异。 - Tomáš Zato
我认为这就是你想要的:https://dev59.com/i0zSa4cB1Zd3GeqPjAyW - fons
similar-text - bitWorking
我认为正则表达式将是最佳解决方案。 - Ripa Saha
5个回答

22

PHP有两个内置函数(主要)来实现此功能。

levenshtein函数用于计算从字符串1到字符串2所需的更改次数(删除/添加/替换)。(值越低越好)

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

啊,Levenshtein函数太完美了!非常感谢,我会在6分钟内接受你的答案 :-)。 - dirk
1
如果你想要更高级的东西,可以查看这篇文章 - gronostaj
@gronostaj:谢谢……但对于我的应用程序来说,这应该已经足够了。性能似乎也还不错 :-)。 - dirk

2

1
$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),但仍然昂贵)。


0

0

你可以采用不同的方法。

你可以使用 similar_text() 函数来检查相似性。

或者

你可以使用 levenshtein() 函数来找出...

Levenshtein 距离被定义为将 str1 转换为 str2 所需替换、插入或删除的最小字符数。

然后检查合理的阈值进行检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接