hatra-e
hatra-e

Reputation: 11

Remove equal part of two strings

In PHP, I have two paths on a server that both have a matching part. I'd like to join them, but delete the part that is equal.

EXAMPLE:

Path #1: /home7/username/public_html/dir/anotherdir/wp-content/uploads

Path #2: /dir/anotherdir/wp-content/uploads/2011/09/image.jpg

You see the part /dir/anotherdir/wp-content/uploads is the same in both strings, but when I simply join them I would have some directories twice.

The output I need is this: /home7/username/public_html/dir/anotherdir/wp-content/uploads/2011/09/image.jpg

Since the dirs can change on different servers I need a dynamic solution that detects the matching part from #2 and removes it on #1 so I can trail #2 right after #1 :)

Upvotes: 1

Views: 1532

Answers (4)

Daniel Guerrero
Daniel Guerrero

Reputation: 46

This code can help you:

$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";

Will detect the equal substrings and will cut the first string until that point and copy the other part from second string.

This code will accept also two strings if they share "partial" substrings like:

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

will output: /path/path2/other/file.png

And will remove the "path3", but with few changes can be more strict

Upvotes: 0

Saurabh
Saurabh

Reputation: 7964

The problem is not so generic here. You should not look at the problem as matching equal parts of strings, rather you should look at it like equal directory structure. That said you need to concentrate on strings after '/'. So basically you need to do string matching of directory names. Moreover your problem looks like that first input file name's last part of directory structure name may be common to some part (starting from first character) of second input string.

So I will suggest to start reading the first input from end at the jumps of '/' and try to get first string matching with the first folder name in second file-path. If match happens then rest of the string character from this index to last index in first file-path should be there in first part of second input string. If this condition fails the repeat the process of finding the first directory name in second string matching with a directory name in first file-name for next index.

Upvotes: 0

JRL
JRL

Reputation: 78033

$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)));

Upvotes: 6

Alex J
Alex J

Reputation: 1567

how about using the similar_text as described in this link. It returns the matching chars between two strings. Once you have it, replace the first one with empty string and append the second.

Upvotes: -1

Related Questions