打印2个字符串之间的所有公共部分

时间:2017-04-25 16:44:22

标签: php

正如标题所说,我需要获得2个字符串之间最长的公共子串。问题是我还需要打印所有公共部分,如果不止一个。例如:

$ string1 =" asbafbae MATCH1 asjdndrey MATCH2 ";

$ string2 =" 12412342gt MATCH1 hgm1g5m MATCH2 ";

需要的输出:MATCH1,MATCH2

这是我使用的代码,我设法得到最长的公共子字符串,但只有一个。

<?php
function getLongestMatchingSubstring($str1, $str2)
{
    $len_1 = strlen($str1);
    $longest = '';
    for($i = 0; $i < $len_1; $i++){
        for($j = $len_1 - $i; $j > 0; $j--){
            $sub = substr($str1, $i, $j);
            if (strpos($str2, $sub) !== false && strlen($sub) > strlen($longest)){
                $longest = $sub;
                break;
            }
        }
    }
    return $longest;
}

$string1 = 'asbafbaeMATCH1asjdndreyMATCH2';
$string2 = '12412342gtMATCH1hgm1g5mMATCH2';
echo getLongestMatchingSubstring($string1, $string2);
?>

我得到 MATCH1 作为输出。也许我写的代码专门用来获得最长的代码。希望有人能帮助我

1 个答案:

答案 0 :(得分:0)

我修改了你的函数以获得数组中最长的匹配

<?php
function getLongestMatchingSubstring($str1, $str2)
{
    $len_1 = strlen($str1);
    $longest = array();
    for($i = 0; $i < $len_1; $i++){
        for($j = $len_1 - $i; $j > 0; $j--){
            $sub = substr($str1, $i, $j);
            if (strpos($str2, $sub) !== false && strlen($sub) > 1){
                $longest[] = $sub;
                $i = strpos($str1, $sub) + (strlen($sub)-1);
                break;
            }
        }
    }
    return $longest;
}

$string1 = 'asbaMbaeMATCH1asjdndreyMATCH22r5g7jdg3MATCH33';
$string2 = '1241M342gtMAThgMATCH1m1g5mMATCH2cghdiMATCH33';
print_r(getLongestMatchingSubstring($string1, $string2));

输出将是

数组([0] =&gt; M [1] =&gt; MATCH1 [2] =&gt; MATCH2 [3] =&gt; MATCH33)