2011-12-31 26 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

あなたは正規表現を使用したくなかった、あなたは、あなたが​​3210などのようないくつかの基本的な文字列操作関数を使用することができ、ディレクトリ内のすべての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

関連する問題