2011-12-31 52 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 – 2011-12-31 03:39:09

+0

正確。我怎麼錯過了。非常感謝。 – inhan 2011-12-31 03:41:01

+0

還有問題。我用/^(\d+)(_\d+)?(\.jpg)$/嘗試了它,但沒有運氣。 – inhan 2011-12-31 03:55:16

1

如果你不想使用正則表達式,你要確保你有一個目錄中的所有JPG文件,你可以使用​​3210和一些基本的字符串處理函數,像這樣:

$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 2011-12-31 04:04:12

+0

啊,我明白了 - 我誤解了你的問題。我會做一些編輯。 – rdlowrey 2011-12-31 04:06:24

+0

它已經解決,但繼續前進,如果你有一個替代解決方案,如果它不打擾你:) – inhan 2011-12-31 04:23:45

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 2012-01-04 00:57:51