在PHP中,我在服务器上有两个路径都有匹配的部分。我想加入他们,但删除相同的部分。
实施例
路径#1: / home7 /用户名/的public_html /的 DIR / anotherdir /可湿性粉剂内容/上传
路径#2: 的 /目录/ anotherdir /可湿性粉剂内容/上传 /2011/09/image.jpg
你看到两个字符串中的 / dir / anotherdir / wp-content / uploads 部分相同,但是当我加入它们时,我会有两次目录。
我需要的输出是这样的: 的 /home7/username/public_html/dir/anotherdir/wp-content/uploads/2011/09/image.jpg
由于dirs可以在不同的服务器上进行更改,因此我需要一个动态解决方案来检测#2中的匹配部分并将其删除#1,这样我就可以在#1之后立即跟踪#2:)
答案 0 :(得分:6)
$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)));
答案 1 :(得分:0)
这里的问题不是那么通用。您不应该将问题视为匹配相等的字符串部分,而应该将其视为相同的目录结构。 那说你需要在'/'后专注于字符串。 所以基本上你需要对目录名进行字符串匹配。此外,您的问题看起来第一个输入文件名的目录结构名称的最后一部分可能是第二个输入字符串的某些部分(从第一个字符开始)共有。
所以我建议在'/'跳转时从头开始读取第一个输入,并尝试在第二个文件路径中获得与第一个文件夹名称的第一个字符串匹配。如果匹配发生,则从该索引到第一个文件路径中的最后一个索引的其余字符串字符应该在第二个输入字符串的第一部分中。如果此条件失败,则重复在第二个字符串中查找第一个目录名称的过程,该第二个字符串与第一个文件名中的目录名称匹配,用于下一个索引。
答案 2 :(得分:0)
此代码可以帮助您:
$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”,但几乎没有变化可以更严格
答案 3 :(得分:-1)
如this链接中所述使用similar_text
怎么样?它返回两个字符串之间的匹配字符。一旦你拥有它,用空字符串替换第一个并附加第二个。