您能想到解决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';
}
答案 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);
答案 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 happyness
和capturing(如单词{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);
数字越小,相似度越大。