2011-12-31 2 views
1

PHP에서 while 루프 문제가 있습니다. 다른 곳에서는 앰퍼샌드 기호를 사용하여 해결할 수있는 것처럼 보입니다. 아래는 그 예입니다. 파일 이름 (기본 이름)에 _n을 추가하려고합니다. _1이 있다면 _2, _2가 _3이되도록하고 싶습니다. 어떤 이유로 나는 변수에서 $ filename 변수를 업데이트 할 수 없으므로 루프에서 변경되지 않았다고 생각합니다.PHP : while 루프 - 조건에서 변경된 변수를 사용합니다.

$dir = 'images'; 
$filename = '123.jpg'; 
$i = 0; 
while (file_exists($dir.'/'.$filename)) { 
    $filename = preg_replace('/^(\d*?)(\.jpg)$/',"$1_".(++$i)."$2",$filename); 
} 
echo $filename; 

내가 뭘 잘못하고 있니?

답변

3

정규 표현식이 약간 벗어난 것처럼 보입니다. 이미 존재하는 경우 _n을 캡처하지 않습니다.

while (file_exists($dir.'/'.$filename)) { 
    $filename = preg_replace('/^(\d+)(.*)(\.jpg)$/',"$1_".(++$i)."$3",$filename); 
    //-------------------------------^^^^ Capture the _n if it exists 
    // And stick the number in with $1 and $3 (now the .jog) 
} 
echo $filename; 

// Current files... 
123_1.jpg 
123_2.jpg 
123.jpg 

// Outputs 123_3.jpg 
+0

나는 같은 결론에 도달했다. +1 –

+0

정확합니다. 나는 그것을 어떻게 놓쳤는가? 고마워. – inhan

+0

아직 잘못되었습니다. 나는 /^(\d+)(_\d+)?(\.jpg)$/와 함께 시도했지만 아직 행운이 없다. – inhan

1

당신은 정규식을 사용하지 않았고 당신은 당신이 모든 당신이 glob()을 사용할 수있는 디렉토리에 JPG 파일 등과 같은 몇 가지 기본적인 문자열 조작 기능을 가지고 만들고 싶었다 경우

$dir = 'images/'; 
foreach (glob($dir.'*.jpg') as $file) { 
    $ext = strpos($file, '.jpg'); // get index of the extension in string 
    $num = (int) substr($file, 0, $ext); // get the numeric part 
    $file = $num+1 . '.jpg'; // rebuild the file name 
    echo $file, PHP_EOL; 
} 
+0

고마워요. 이 문제는 해당 이름을 가진 파일이 이미있는 경우 ** _ n **을 기본 이름에 추가하는 것입니다. 마지막 줄에 파일 이름이 '123.jpg'에서 '124.jpg'로 변경 되었습니까, 아니면 잘못 이해 했습니까? – inhan

+0

아하 나는 본다 - 나는 당신의 질문을 오해했다. 나는 약간의 편집을 할 것이다. – rdlowrey

+0

해결되었지만 다른 솔루션이 있고 문제가되지 않는 경우 계속 진행하십시오. – inhan

0

다음은 함수와 정규식을 사용하지 않은 예입니다. 이 방법은 훨씬 더 넓은 범위의 상황에서 작동합니다.

은 파일 확장자는 밑줄이나, 마이클의 답변을 참조 다음() 깨끗 preg_replace이다를 사용하는 일이 필요하지 않은 경우 기간이 기본 이름

허용, 작동하고, 즉.

<?php 

function nextUnusedFileName($path, $fileName){ 
    $index = 1; 
    while (file_exists($path."/".$fileName)) 
    { 
     $baseNameEndIndex = strrpos($fileName, '_'); 
     $extensionStartIndex = strrpos($fileName, '.'); 
     if($baseNameEndIndex <= 0){ 
      $baseNameEndIndex = $extensionStartIndex; 
     } 
     $baseName = substr($fileName, 0, $baseNameEndIndex)."_".$index; 
     $extension = substr($fileName, $extensionStartIndex+1, strlen($fileName)-$extensionStartIndex); 
     $fileName = $baseName.".".$extension; 
     $index++ ; 
    } 
    return $fileName; 
}//end nextUnusedFileName 


//main 

$dir = "images"; 
$filename = "123.jpg"; 

$filename = nextUnusedFileName($dir, $filename); 

echo $filename; 
?> 
+0

고마워요. . – inhan