簡體   English   中英

PHP-如何在點擴展名前的括號內增加文件名ID?

[英]PHP - How to increment a filename id within braces before the dot extension?

我有一個文件,該文件會不時地進行修改,並且每次文件有新更改時都需要跟蹤文件名。 我希望最終得到一個文件名序列,例如:first-filename-1701.txt,2nd-filename-1701(1).txt,3rd-filename-1701(2).txt等。我在下面的代碼中生成的文件名為:first-filename-1701.txt,2nd-filename-1701(1).txt,3rd-filename-1702(2).txt,4th-filename-1703(3) .txt等。 有人可以指出我做錯了什么嗎? 正則表達式不是我每天的事情。 謝謝。

$name = 'new-foo-bar-1701(1).txt';

$re1='.*?';         # Non-greedy match on filler
$re2='\(([\d]+)\)'; # Round Braces 1

// set new filename
$_name = "";

// check if true
if($c=preg_match_all("/".$re1.$re2."/is", $name, $matches))
{
    $rbraces  = $matches[1][0] + 1;
    $_name .= preg_replace("/".$matches[1][0]."/", $rbraces, $name); 
}
else
{
    $_name .=$name; 
}

print $_name; // new-foo-bar-1702(2).txt

您無需查找匹配項即可在以后替換它們,從而避免了替換。 您應該使用preg_replace_callback替換“即時”,它將完全替換匹配(或捕獲)的內容。

$name = 'new-foo-bar-1701(1).txt';

$re1='.*';          # Greedy match on filler
$re2='\((\d+)\)';   # Round Braces 1

// set new filename
$_name = "";

$_name .= preg_replace_callback("/(".$re1. ")".$re2."/", function($m){
    return $m[1] . "(" . ($m[2] + 1) . ")";
}, $name); 

print $_name;

IDEONE演示

請注意,由於您計划替換字符串末尾的數字,因此, 貪婪的點匹配 “填充符是首選。

我認為除了這行代碼外,您的代碼沒有太多更改

$_name .= preg_replace("/\(".$matches[1][0]."\)/", "(".$rbraces.")", $name); 

Ideone演示

說明

\\d+匹配到1 ,但有1已經出現兩次在您的字符串。 因此將其替換為2702(2)

為了從()專門匹配1 ,您需要如上所述將其放入正則表達式中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM