PHP:在条件中使用修改后的变量


PHP: using the altered variable in the condition

我在PHP中有一个while循环问题,似乎可以使用&符号来解决,如果它在其他地方,则可以将其作为引用。下面是一个例子。我试图将_n附加到文件名(在basename中)。如果有_1,我希望它是_2,如果有_2,我希望它是_3,以此类推。由于某些原因,我无法在条件中更新$filename变量,所以我认为它没有在循环中被更改。

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

我做错了什么?

看起来您的正则表达式有点偏离,如果_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

如果你不想使用正则表达式,你想确保你在一个目录中得到所有的jpg文件,你可以使用glob()和一些基本的字符串操作函数,如:

$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;
}

下面是一个使用函数而不使用正则表达式的示例。这种方法适用于更广泛的情况。

。任何文件扩展名都可以工作,并且,在基本名称

中允许下划线或句号。

如果你不需要这些东西,那么使用preg_replace()会更简洁,参见Michael的回答。

<?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;
?>