在php中比较字符串的方法

时间:2015-04-21 19:45:40

标签: 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类型方法可能会有更复杂的编码答案,但我想知道是否还有一些我找不到的东西。

3 个答案:

答案 0 :(得分:2)

您可以使用levenshtein()功能:

  

Levenshtein距离定义为您必须替换,插入或删除以将str1转换为str2的最小字符数。算法的复杂度为O(m * n),其中n和m是str1和str2的长度(与similar_text()相比较好,即O(max(n,m)** 3),但是仍然很贵)。

例如Levenshtein距离"英语"和" GCSE英语郎10年级"是12。

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

答案 1 :(得分: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";
}

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

答案 2 :(得分: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