删除两个字符串相等的部分


Remove equal part of two strings

在PHP中,我在服务器上有两个路径,它们都有一个匹配部分。我想加入他们,但删除相等的部分。

的例子:

路径# 1:/home7/用户名/public_html/ dir/anotherdir/wp-content/上传

路径# 2:/dir/anotherdir wp-content/上传/2011/09/image.jpg

您可以看到/dir/anotherdir/wp-content/uploads在两个字符串中是相同的,但是当我简单地将它们连接起来时,我会有一些目录两次。

我需要的输出是这样的:/home7/用户名/public_html/dir/anotherdir/wp-content/上传/2011/09/image.jpg

由于dirs可以在不同的服务器上更改,因此我需要一个动态解决方案来检测#2的匹配部分并在#1上删除它,以便我可以在#1之后跟踪#2

$path1 = "/home7/username/public_html/dir/anotherdir/wp-content/uploads";
$path2 = "/dir/anotherdir/wp-content/uploads/2011/09/image.jpg";
echo $path1 . substr($path2, strpos($path2, basename($path1)) + strlen(basename($path1)));

这里的问题不是那么普遍。你不应该把这个问题看成匹配相等部分的字符串,而应该把它看成相等的目录结构。也就是说你需要关注'/'之后的字符串。基本上你需要做目录名的字符串匹配。此外,您的问题看起来像是第一个输入文件名的目录结构名称的最后一部分可能与第二个输入字符串的某些部分(从第一个字符开始)相同。

所以我建议从'/'的跳转处开始读取第一个输入,并尝试获得与第二个文件路径中的第一个文件夹名称匹配的第一个字符串。如果匹配发生,那么从这个索引到第一个文件路径中最后一个索引的其余字符串字符应该在第二个输入字符串的第一部分。如果此条件失败,则重复查找第二个字符串中与下一个索引的第一个文件名中的目录名匹配的第一个目录名的过程。

以下代码可以帮助您:

$str1 = $argv[1];
$str2 = $argv[2];
//clean
$str1 = trim(str_replace("//", "/", $str1), "/");
$str2 = trim(str_replace("//", "/", $str2), "/");
$paths1 = explode("/", $str1);
$paths2 = explode("/", $str2);
$j = 0;
$found = false;
$output = '';
for ($i=0; $i<count($paths1); $i++) {
        $item1 = $paths1[$i];
        $item2 = $paths2[$j];
        if ($item1 == $item2) {
                if (!$found)
                        $found = $i; //first point
                $j++;
        } else if ($found) {
                //we have found a subdir so remove
                $output = "/".implode("/", array_slice($paths1, 0, $i))
                                ."/".implode("/", array_slice($paths2, $j));
                $found = false;
                break;
        }
}
//final checking
if ($found) {
        $output = "/".implode("/", $paths1)
                                ."/".implode("/", array_slice($paths2, $j));
}
print "FOUND?: ".(!empty($output)?$output:'No')."'n";

将检测相等的子字符串,并将第一个字符串剪切到该点,并从第二个字符串复制另一部分。

如果两个字符串共享"部分"子字符串,则此代码也将接受两个字符串,如:

/path1/path2/path3
/path2/other/file.png

将输出:/path/path2/other/file.png

和将删除"path3",但有一些变化可以更严格

如何使用这个链接中描述的similar_text。它返回两个字符串之间匹配的字符。有了它之后,用空字符串替换第一个字符串,并附加第二个字符串。