用于相似性检查的PHP正则表达式
您能想出任何正则表达式来解决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
$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;