2011-10-25 4 views
0

PHP에서는 서버에 두 부분이 모두 일치하는 부분이 있습니다. 나는 그들과 합류하고 싶지만 평등 한 부분을 지우고 싶다.두 문자열의 동일 부분 제거

예 :

경로 # 1 : /home7/이름/public_html을/디렉토리/anotherdir/WP - 콘텐츠/업로드

경로 # 2 : /디렉토리/anotherdir/WP- 내용/업로드 /2011/09/image.jpg 당신은 부분 /디렉토리/anotherdir/WP - 콘텐츠/업로드 두 문자열의 동일 볼 수 있지만, 단순히 그들과 합류 할 때 나는 그렇게 할 것이다

나 디렉토리 두 번.

내가 필요로하는 출력은 이것이다 : /home7/username/public_html/dir/anotherdir/wp-content/uploads/2011/09/image.jpg DIRS가 다른 서버에 변경할 수 있기 때문에

# 2에서 일치하는 부분을 감지하고 # 1 직후에 # 2를 추적 할 수 있도록 # 1에서 제거하는 동적 솔루션이 필요합니다.

답변

4
$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

this 링크에 설명 된대로 similar_text을 사용 하는게 어떻습니까? 두 문자열 사이에 일치하는 문자를 반환합니다. 일단 당신이 그것을 가지고, 빈 문자열로 첫 번째 교체하고 두 번째를 추가하십시오.

+0

아니요,이 함수는 일치하는 비율의 INT를 반환합니다. 죄송 합니다만 문제의 용도가 없습니다. –

0

문제는 여기에 일반적이지 않습니다. 문자열의 동등한 부분을 일치시키는 것으로서 문제를 보지 말고, 동등한 디렉토리 구조처럼보아야합니다. 그렇다면 '/'다음에 문자열에 집중해야한다고했습니다. 기본적으로 디렉토리 이름의 문자열 일치를 수행해야합니다. 또한 문제는 디렉토리 구조 이름의 첫 번째 입력 파일 이름의 마지막 부분이 두 번째 입력 문자열의 일부 (첫 번째 문자에서 시작하는 부분)에 공통적 일 수있는 것처럼 보입니다.

그래서 '/'의 점프에서 첫 번째 입력을 끝내기 시작하고 두 번째 파일 경로의 첫 번째 폴더 이름과 일치하는 첫 번째 문자열을 얻는 것이 좋습니다. 일치가 발생하면 첫 번째 file-path에서이 인덱스의 나머지 문자열 문자가 나머지 두 번째 입력 문자열의 첫 번째 부분에 있어야합니다. 이 조건이 실패하면 다음 색인의 첫 번째 파일 이름에있는 디렉토리 이름과 일치하는 두 번째 문자열에서 첫 번째 디렉토리 이름을 찾는 과정을 반복하십시오.

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

그리고 "경로 3"를 제거하지만,로에게 몇 가지 변경이 될 수 있습니다 보다 엄격한