Удалить равную часть двух строк

#php

#php

Вопрос:

В PHP у меня есть два пути на сервере, оба из которых имеют совпадающую часть. Я бы хотел присоединиться к ним, но удалить ту часть, которая равна.

ПРИМЕР:

Путь №1: /home7/имя пользователя/public_html/каталог/anotherdir/wp-контент/загрузки

Путь №2: /dir/anotherdir/wp-content/uploads/2011/09/image.jpg

Вы видите, что часть /dir/anotherdir/wp-content/uploads одинакова в обеих строках, но когда я просто присоединюсь к ним, у меня будет несколько каталогов дважды.

Результат, который мне нужен, таков: /home7/username/public_html/dir/anotherdir/wp-content/uploads/2011/09/image.jpg

Поскольку каталоги могут меняться на разных серверах, мне нужно динамическое решение, которое обнаруживает соответствующую часть из # 2 и удаляет ее на # 1, чтобы я мог отслеживать # 2 сразу после # 1 🙂

Ответ №1:

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

Ответ №2:

Проблема здесь не такая общая. Вы не должны смотреть на проблему как на совпадение равных частей строк, скорее вы должны смотреть на нее как на равную структуру каталогов. Тем не менее, вам нужно сосредоточиться на строках после ‘/’. Итак, в основном вам нужно выполнить сопоставление строк имен каталогов. Более того, ваша проблема выглядит так, что последняя часть имени первого входного файла имени структуры каталогов может быть общей для некоторой части (начиная с первого символа) второй входной строки.

Поэтому я предложу начать чтение первого ввода с конца при переходе через ‘/’ и попытаться получить первую строку, совпадающую с именем первой папки во втором пути к файлу. Если совпадение происходит, то остаток строкового символа от этого индекса до последнего индекса в первом пути к файлу должен быть там в первой части второй входной строки. Если это условие не выполняется, повторите процесс поиска первого имени каталога во второй строке, совпадающего с именем каталога в первом имени файла для следующего индекса.

Ответ №3:

Этот код может помочь вам:

 $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; $iamp;<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», но с небольшими изменениями может быть более строгим

Ответ №4:

как насчет использования similar_text , как описано в этой ссылке. Он возвращает совпадающие символы между двумя строками. Как только он у вас будет, замените первую строку пустой строкой и добавьте вторую.

Комментарии:

1. Нет, эта функция возвращает значение INT с соответствующим процентом совпадения. Извините, что это не имеет никакого отношения к проблеме.