PHP Regex用于相似性检查

时间:2019-12-18 15:07:17

标签: php regex

您能想到解决PHP中这些相似之处的任何正则表达式吗?这样做的目的是在不考虑最后一个字母的情况下进行比赛。

<?php


$word1 = 'happyness';
$word2 = 'happys';

if (substr($word1, 0, -4) == substr($word2, 0, -1))
{
    echo 'same word1';
}


$word1 = 'kisses';
$word2 = 'kiss';


if (substr($word1, 0, -2) == $word2)
{
    echo 'same word2';
}


$word1 = 'consonant';
$word2 = 'consonan';


if (substr($word1, 0, -1) == $word2)
{
    echo 'same word3';
}

6 个答案:

答案 0 :(得分:2)

您可以使用一个小的辅助函数,第一个函数仅与第二个字符串的长度匹配,因此不必关心它会截断多少个字符。主要代码的工作方式与您的代码类似,不同之处在于它使用第二个值的长度作为要获取的子字符串的长度。

function match( string $a, string $b )  {
    return substr($a, 0, strlen($b)) === $b;
}

此功能稍微复杂一些,因为它考虑了最大缝隙长度...

function match( string $a, string $b, int $length = 3 )  {
    $len = max(strlen($a)-$length, strlen($b));
    return substr($a, 0, $len) === $b;
}

因此,按以下方式称呼它

$word1 = 'happyness';
$word2 = 'happys';

if (match($word1,$word2))
{
    echo 'same word1';
}

答案 1 :(得分:2)

您可以使用preg_match将这些数据与正则表达式匹配,/^word2/word1相匹配。因此,正则表达式会检查word1是否以word2开头,因为开头是^符号。

匹配之前最好preg_quote(),以转义正则表达式元字符以获得准确结果。

<?php


$tests = [
        [
          'happyness',
          'happys'
        ],
        [
            'kisses',
            'kiss'
        ],
        [
            'consonant',
            'consonan'
        ]
    ];

$filtered = array_filter($tests,function($values){
    $values[1] = preg_quote($values[1]);
    return preg_match("/^$values[1]/",$values[0]) === 1;
});

print_r($filtered);

演示: https://3v4l.org/SLf15

答案 2 :(得分:2)

您还可以执行一个小功能来查找给定2个单词之间的相似性。它可能看起来像:

function similarity($word1, $word2)
{
    $splittedWord1 = str_split($word1);
    $splittedWord2 = str_split($word2);

    $similarChars = array_intersect_assoc($splittedWord1, $splittedWord2);

    return count($similarChars) / max(count($splittedWord1), count($splittedWord2));
}

var_dump(similarity('happyness', 'happys'));
var_dump(similarity('happyness', 'testhappys'));
var_dump(similarity('kisses', 'kiss'));
var_dump(similarity('consonant', 'consonan'));

结果如下:

float(0.55555555555556)
int(0)
float(0.66666666666667)
float(0.88888888888889)

基于结果百分比,您可以决定是否应将给定的单词视为相同。

答案 3 :(得分:2)

通过将单词happys happynesscapturing(如单词{1)和word characters(如单词2)匹配,将单词1中的See this demo at regex101放在一起。 flag。将其与i preg_match配合使用以进行无Cascas匹配。

^(\w+)\w* \1

要在this PHP demo at tio.run的PHP中使用它,请参见https://www.markhansen.co.nz/javascript-optional-parameters/

preg_match('/^(\w+)\w* \1/i', preg_quote($word1,'/')." ".preg_quote($word2,'/'), $out);

其中$out[1]保存捕获的内容,或者$out将是一个空数组,如果没有匹配项。

答案 4 :(得分:1)

我不确定regex是否是这里的答案。

您可以尝试使用similar_text(),它返回相似字符的数量(并且可以选择将百分比值设置为变量)。也许如果您认为最后两个字母不重要,则可以查看strlen() - $skippedCharacters是否与所匹配的相同。例如:

$skippedCharacters = 2;

$word1 = 'kisses';
$word2 = 'kiss';

$match = similar_text($word1, $word2);

if ($match + $skippedCharacters >= strlen($word1))
{
    echo 'same word2';
}

答案 5 :(得分:1)

您可以使用PHP levenshtein函数。

levenshtein()函数返回两个字符串之间的Levenshtein距离。 Levenshtein距离是您必须替换,插入或删除以将string1转换为string2的字符数。

$lev = levenshtein($word1, $word2);

数字越小,相似度越大。