Увеличьте имя изображения, если оно уже существует

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

Пример: 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 . Как я могу этого добиться?


person amitshree    schedule 03.12.2015    source источник


Ответы (1)


Вам просто нужно проверить, чем заканчивается строка, для этого не нужно использовать регулярное выражение. Воспользуйтесь слабой типизацией и 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, чтобы увидеть, как оно будет реагировать на различные входные данные.

person Jonathan Mee    schedule 03.12.2015