Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于相似性检查的PHP正则表达式_Php_Regex - Fatal编程技术网

用于相似性检查的PHP正则表达式

用于相似性检查的PHP正则表达式,php,regex,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)

您能想出任何正则表达式来解决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';
}

我不确定正则表达式是否是这里的答案

您可以尝试,它返回相似字符的数量,并可以选择为变量设置一个百分比值。也许如果你把最后两个字母看作不重要的,你可以看到SrLun-$Sigple字符是否与匹配的字符相同。例如:

$skippedCharacters=2; $word1=‘亲吻’; $word2='kiss'; $match=相似的文本$word1,$word2; 如果$match+$skippedCharacters>=strlen$word1 { 呼应“同一个词2”; }
我不确定正则表达式是否是这里的答案

您可以尝试,它返回相似字符的数量,并可以选择为变量设置一个百分比值。也许如果你把最后两个字母看作不重要的,你可以看到SrLun-$Sigple字符是否与匹配的字符相同。例如:

$skippedCharacters=2; $word1=‘亲吻’; $word2='kiss'; $match=相似的文本$word1,$word2; 如果$match+$skippedCharacters>=strlen$word1 { 呼应“同一个词2”; }
您可以使用一个小的helper函数,第一个函数只匹配第二个字符串的长度,所以不管它截断了多少个字符。主代码的工作原理与您的代码类似,只是它使用第二个值的长度作为要获取的子字符串的长度

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';
}

您可以使用一个小的helper函数,第一个函数只匹配第二个字符串的长度,所以不管它截断了多少个字符。主代码的工作原理与您的代码类似,只是它使用第二个值的长度作为要获取的子字符串的长度

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';
}
您可以使用将这些数据与regex作为/^word2/与word1进行匹配。因此,正则表达式将检查word1是否以word2开头,因为开头有^symbol

为了获得准确的结果,最好在匹配之前转义正则表达式元字符

<?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);
演示:

您可以使用将这些数据与regex作为/^word2/与word1进行匹配。因此,正则表达式将检查word1是否以word2开头,因为开头有^symbol

为了获得准确的结果,最好在匹配之前转义正则表达式元字符

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

演示:

您还可以使用一个小函数来查找给定两个单词之间的相似性。它可能看起来像:

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)
结果如下:

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)

根据结果百分比,您可以决定给定的单词是否应被视为相同。

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

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)
结果如下:

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)

根据结果百分比,您可以决定给定的单词是否应被视为相同。

将单词像happys Happiness一样放在一起,并将单词1中与单词2匹配的单词放在一起。将其与i一起使用,以实现无casless匹配

^(\w+)\w* \1
要在PHP中与一起使用,请参见


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

将单词像happys happiness一样放在一起,并将单词1中与单词2匹配的单词放在一起。将其与i一起使用,以实现无casless匹配

^(\w+)\w* \1
要在PHP中与一起使用,请参见


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

您可以使用PHP levenshtein函数

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


数字越小,相似性越大

您可以使用PHP levenshtein函数

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


数字越小,相似性越大

第一个字母怎么匹配?最后一个字母。因此,快乐不会匹配。@Raymont Output确实为您创建了一个匹配。您能解释一下这个匹配背后的规则吗?请编辑您的问题“第一个字母如何匹配?最后一个字母?”。因此,快乐不会匹配。@Raymont Output确实为您创建了一个匹配。您能解释一下这个匹配背后的规则吗?请通过编辑您的问题来做到这一点。做得好,这是一个很好的解决误报的强大解决方案,这也是一个大问题。谢谢@Raymont,很高兴它能提供帮助@Raymont你能举一些假阳性的例子吗?这是一个假阳性,只有当第一个字母达到
匹配这就是为什么我设置了至少5个字母的条件$word1=‘万圣节’$word2='h';回显'match'。preg_match'/^\w+\w*\1/i',preg_quote$word1'/'。preg_quote$word2,“/”,$out;做得好,这是一个很好的解决误报的强大解决方案,这也是一个大问题。谢谢@Raymont,很高兴它能提供帮助@Raymont你能举一些假阳性的例子吗?这是一个假阳性,只有第一个字母匹配,这就是为什么我设置了至少5个字母的条件$word1=‘万圣节’$word2='h';回显'match'。preg_match'/^\w+\w*\1/i',preg_quote$word1'/'。preg_quote$word2,“/”,$out;