2014-10-11 4 views
0

의 차이를 제거 : $result = 'ABCDEF123-20140705.xml'나는 두 문자열이 비교하고 두 문자열

결과 사이의 차이 :
$stringTwo = 'ABCDEF123-20140705-589.xml';

$stringOne = 'ABCDEF123-20140705-546.xml';을 나는이처럼 보이는 새 문자열을 만들 필요 두 입력 문자열은 끝에 하이픈과 3 자리 숫자가 제거 된 것입니다. 입력 문자열이 XML 확장 전에 마지막 3 자리 숫자와 완전히 동일하다는 점을 감안할 때 이것이 가능해야한다고 생각합니다.

이유는 내가 같은 형식으로 모두를 비교할 필요가 같은 문자열이 수백 있기 때문에 이것은 단지 문자열을 -546-589을 제거하는 것만 큼 간단하지 않습니다. 문자열 접두사 그대로).

아이디어가 있으십니까?

또 다른 두 가지 예를 들어 문자열이 될 수 :

$stringOne = 'XJ1ERJJFK-20140305-128.xml';
$stringTwo = 'XJ1ERJJFK-20140305-584.xml';

나는 결과가 싶습니다 어떤이 같은 $result = 'XJ1ERJJFK-20140305.xml'

+0

trivi al은 각 문자를 비교하는 for 루프를 작성합니다. 더 필요한 것이 있습니까? – webbiedave

+0

@webbiedave 무슨 뜻인지 모르겠다. 문제의 입력 문자열의 레이아웃을 기반으로 두 문자열 간의 차이를 대규모로 제거해야한다. – jskidd3

+0

문자열의 길이를 얻고 (배열 구문을 사용하여) 문자열의 각 문자를 'for'합니다. 두 번째 문자열과 비교합니다 (같지 않으면 세 번째 문자열로 복사하지 않습니다). 아주 간단한 알고리즘. – webbiedave

답변

2

뭔가?

사용은()

function cut($string) 
{ 
    // divide filename in basename and extension (simple solution) 
    $filenameParts = explode('.', $string); 
    $filename = $filenameParts[0]; 
    $extension = $filenameParts[1]; 

    $parts = explode('-', $filename); // split to an array 
    unset($parts[2]); // remove the parts from array 
    return implode('-', $parts) .'.' .$extension; // combine new filename 
} 

사용 preg_replace이다()을 폭발 (1)

또는 정규식과 짧은. 이 정규 표현식은 문자열에 기술 된 모든 구성 요소를 기대합니다. 첫 번째 블록에는 알파가 있고 두 번째 블록에는 날짜가 있습니다.

function cut($string) { 
    return preg_replace('/^([A-Z0-9]{9}\-[0-9]{8})(?:\-[0-9]{3})(\.xml)$/i', '$1$2', $string); 
} 

Regular expression visualization

Debuggex Demo

사용 preg_replace이다() (2)

업데이트 :는 다른 솔루션은 N이 숫자 문자열 -NNN.을 대체 할 수 , 다음과 같이 :

function cut($string) { 
    return preg_replace('/\-[0-9]{3}\./i', '.', $string); 
} 

Regular expression visualization

Debuggex Demo

그리고 자주 당신이 필요로하는 함수를 호출 : 배열에 여러 문자열을

$stringOne = 'XJ1ERJJFK-20140305-128.xml'; 
$stringTwo = 'XJ1ERJJFK-20140305-584.xml'; 

$stringOneNew = cut($stringOne); // returns "XJ1ERJJFK-20140305.xml" 

하려면 다음을 수행하십시오

$new_array = array(); 
foreach ($your_array as $filename) { 
    $new_array[$filename] = cut($filename); 
} 

결과적인,은 다음과 같습니다 :

$new_array = array(
    // 'key' => 'value' 
    // 'original' => 'generated with cut func' 
    'ABCDEF123-20140705-546.xml' => 'ABCDEF123-20140705.xml', 
    'ABCDEF123-20140705-589.xml' => 'ABCDEF123-20140705.xml', 
    'XJ1ERJJFK-20140305-128.xml' => 'XJ1ERJJFK-20140305.xml', 
    // ... 
); 

는 이제 매핑, 배열 값으로하여 비교 문자열과 나중에 물건 필요한 경우 키와 원본을 가지고있다. 그럼 당신은 예컨대, 그것과 함께 많은 트릭을 수행 할 수 있습니다 :

$unique_array_keys = array_keys($filenames); // array('ABCDEF123-20140705-546.xml', 'ABCDEF123-20140705-589.xml', 'XJ1ERJJFK-20140305-128.xml') 
$unique_array_values = array_unique(array_values($filenames)); // array('ABCDEF123-20140705.xml', 'XJ1ERJJFK-20140305.xml') 

// and more... 
1

여기에 그것을 수행하는 방법의 예는이 문자열

에 차이를 제거합니다. 이렇게하면 문자열의 각 문자를 비교하고 차이점과 파일 이름에 후행 대시를 남겨 둡니다. 당신은 가장자리의 경우에 맞게 그것을 더 조정할 필요가 있습니다 : 당신이 문자열이 올바른 형식을 다음과 확실 경우

$str1 = 'XJ1ERJJFK-20140305-128.xml'; 
$str2 = 'XJ1ERJJFK-20140305-584.xml'; 

$pi1 = pathinfo($str1); 
$pi2 = pathinfo($str2); 

if ($pi1['extension'] === $pi2['extension']) { 
    $newExt = '.' . $pi1['extension']; 
} else { 
    $newExt = ''; 
} 

$piLen1 = strlen($pi1['filename']); 

$newStr = ''; 
for ($i = 0; $i < $piLen1; $i++) { 
    if ($pi1['filename'][$i] == $pi2['filename'][$i]) { 
     $newStr .= $pi1['filename'][$i]; 
    } 
} 

$newStr = rtrim($newStr, '-') . $newExt; 

echo $newStr; // XJ1ERJJFK-20140305.xml 
0

를, 이것을 사용 :

function cutXmlFilePath($string) { 
    return substr($string, 0, strrpos($string, '-')) . '.xml'; 
} 

샘플 사용 :

$strings = array(
    'ABCDEF123-20140705-546.xml', 
    'ABCDEF123-20140705-589.xml'); 
$result = array_map('cutXmlFilePath', $strings); 
var_dump($result); 

출력 :

array (size=2) 
    0 => string 'ABCDEF123-20140705.xml' (length=22) 
    1 => string 'ABCDEF123-20140705.xml' (length=22) 
관련 문제