2015-04-21 54 views
3

我想比较两个字符串并返回一个比较级别。比较字符串的方法php

字符串1是输入,可以来自客户端的一系列格式。例如:

string 1 - "GCSE English Lang Year 10" or 
string 1 - "Year 10 Eng Lang GCSE" etc 

字符串2是我想要与之比较的字符串。例如:

string 2 - "English Language" 

我知道我可以使用preg_match寻找一个精确的模式:

$subject = $inputString; 
$pattern= "/Eng/"; 
if (preg_match($pattern, $inputString)) 
{ 
echo "match"; 
} 

但是有没有将返回匹配的因素,而不是简单的是或否的方法?我意识到,使用preg_match类型的方法可能会出现更复杂的编码答案,但我想知道是否有已经存在的东西我没有找到。

+0

*匹配的因素,*请稍后再描述一下这个预期的结果会在这里 – Rizier123

+0

好吧,我正在考虑从1到100的分数。 – RGriffiths

+1

http://php.net/manual/en/function.similar-text.php可能是另一个很好的例子,如果需要的话,甚至可以计算出相似百分比。 – AbraCadaver

回答

2

可以使用levenshtein()功能:

的Levenshtein距离被定义为必须更换,插入或删除转化成STR1 STR2字符的最小数量。算法的复杂度为O(m * n),其中n和m是str1和str2的长度(与similar_text()相比较好,即O(max(n,m)** 3)仍然昂贵)。

例如,对于“英语”和“普通中等教育证书英朗10年”的Levenshtein距离是12

$lev = levenshtein('GCSE English Lang Year 10', 'English Language'); 
echo $lev; // 12 
+0

这看起来像可以工作的东西。谢谢 - 我会看看那个。无论哪种方式,一个很好的功能 - 欢呼。 – RGriffiths

+0

省长 - 非常感谢 – RGriffiths

0

你有你最需要什么。你需要捕获你找到的匹配,然后你可以使用levenshtein来查看它与完整单词的不同之处。

$subject = $inputString; 
$pattern= "/Eng[a-zA-Z]+/"; // I made it clear that I want all letters in the word. 
$matches = array(); // This is an array of all the words that match. 
if (preg_match($pattern, $inputString, $matches)) 
{ 
    $match = $matches[0]; // Check first match - assume only one matched. 
    $diff = levenshtein(strtolower($match), 'english'); 
    print "Found $match which is $diff edits from English.\n"; 
} 

现在,最大$差异将是:max(strlen($match), strlen('english'));。如果您将$ max设置为最大差异,则从0到100的相似度将为100*($max-$diff)/$max; - 但我建议您不要这样做。这是一个糟糕的指标。坚持$ diff并寻找最低的$ diff。

0

也许是这样的:

$string1 = "GCSE English Lang Year 10"; 
$string2 = "Year 10 Eng Lang GCSE"; 

$i = array_intersect(
    str_word_count(strtolower($string1), 2), 
    str_word_count(strtolower($string2), 2) 
); 
$similarityPercentage = count($i)/max(count($array1), count($array2)) * 100; 

,它计算的相同词语的两个字符串的百分比,但它不允许的English缩写来Eng