PHP preg_match 检查文件名以括号中的数字结尾(例如文件名 (1).pdf)

PHP preg_match check filename ends with bracketed number (e.g. filename(1).pdf)

我正在寻找一个 preg_match 正则表达式,它可以检测文件名(作为字符串,包含扩展名)末尾是否有 (n)。如果文件名没有 (n),它将在文件名末尾附加 (n)。如果文件名有(n),则文件名末尾会变成(n+1)。

您可以使用 preg_replace_callback 来处理文件名,使用正则表达式检查文件扩展名之前的可选 (n),并使用回调 return 如果数字增加它存在,否则 1.

$filenames = [
    'abc(3).jpg',
    'xyz.pdf'
    ];
    
foreach ($filenames as $filename) {
    echo preg_replace_callback('/(?:\((\d+)\))?(\.[^.]+$)/', 
        function($matches) { 
            $version = empty($matches[1]) ? 0 : $matches[1];
            return '(' . ($version + 1) . ')' . $matches[2];
        },
        $filename);
    echo "\n";
}

输出:

abc(4).jpg
xyz(1).pdf

Demo on 3v4l.org