Я использую следующий формат кода, чтобы изменить имя изображения, если оно уже существует на сервере. Я хочу инкрементные имена изображений, если они уже существуют с тем же именем.
Пример: 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 . Как мне этого добиться?
Вам просто нужно проверить, чем заканчивается строка, для этого не нужно использовать регулярное выражение. Воспользуйтесь слабым набором текста и 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
чтобы увидеть, как он будет реагировать на разные входы.
Других решений пока нет …