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

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

ПРИМЕР:

Путь # 1: / home7 / имя пользователя / public_html / dir / anotherdir / wp-content / uploads

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

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

Мне нужен результат: /home7/username/public_html/dir/anotherdir/wp-content/uploads/2011/09/image.jpg

Поскольку dirs могут меняться на разных серверах, мне нужно динамическое решение, которое обнаруживает совпадающую часть с # 2 и удаляет ее на # 1, поэтому я могу пройти # 2 сразу после # 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))); 

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

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

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

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

 $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

И удалит «путь3», но с небольшими изменениями может быть более строгим