2015-12-03 5 views
1

Я использую следующий код для изменения имени изображения, если он уже существует на сервере. Я хочу инкрементные имена изображений, если они уже существуют с тем же именем.Увеличение имени изображения, если оно уже существует

Ex: abc.png, abc_1.png, abc_2.png

function file_newname($path, $filename){ 
    if ($pos = strrpos($filename, '.')) { 
     $name = substr($filename, 0, $pos); 
     $ext = substr($filename, $pos); 
    } else { 
     $name = $filename; 
    } 

    $newpath = $path.'/'.$filename; 
    $newname = $filename; 
    $counter = 1; 
    while (file_exists($newpath)) { 
     $newname = $name .'_'. $counter . $ext; 
     $newpath = $path.'/'.$newname; 
     $counter++; 
    } 

    return $newname; 
} 

приведенных выше код работают, если имя изображения abc.png. Если уже есть изображение на сервере с именем abc_1.png и я запускаю код, он генерирует формат изображения как abc_1_1.png. Ожидаемый результат: если уже abc_1.png присутствует, и я запускаю код $newname должен вернуть abc_2.png. Как я могу это достичь?

ответ

0

Вам просто нужно проверить, с чем заканчивается строка, нет необходимости использовать регулярное выражение для этого. Воспользуйтесь слабым типом и is_numeric, чтобы найти значение любого предыдущего счетчика.

function file_newname($path, $filename){ 
    if ($pos = strrpos($filename, '.')) { 
     $name = substr($filename, 0, $pos); 
     $ext = substr($filename, $pos); 
    } else { 
     $name = $filename; 
    } 

    $newpath = $path.'/'.$filename; 
    $newname = $filename; 
    // New code here: 
    if(file_exists($newpath)){ 
     $counter = 1; 
     if($pos = strrpos($name, '_')) { 
      $oldcounter = substr($name, $pos + 1); 
      if(is_numeric($oldcounter)){ 
       $counter = $oldcounter + 1; 
       $name = substr($name, 0, $pos); 
      } 
     } 
     $newname = $name . '_' . $counter . $ext; 
     $newpath = $path . '/' . $newname; 

     while (file_exists($newpath)) { 
      $newname = $name .'_'. $counter . $ext; 
      $newpath = $path.'/'.$newname; 
      $counter++; 
     } 
    } 

    return $newname; 
} 

Я упростил функциональность немного, чтобы я мог получить его в живой пример, но если вы хотите играть с кодом в разделе замены, которые я добавил вы можете проверить его здесь: http://ideone.com/xR1v0j Просто измените начальное значение $name, чтобы увидеть, как он будет реагировать на разные входы.

Смежные вопросы