[英]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;
請注意,由於您計划替換字符串末尾的數字,因此, 貪婪的點匹配 “填充符是首選。
我認為除了這行代碼外,您的代碼沒有太多更改
$_name .= preg_replace("/\(".$matches[1][0]."\)/", "(".$rbraces.")", $name);
說明
\\d+
匹配到1
,但有1
已經出現兩次在您的字符串。 因此將其替換為2702(2)
。
為了從()
專門匹配1
,您需要如上所述將其放入正則表達式中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.