我有一个文件会不时得到修改,我需要在每次对文件进行新的更改时跟踪文件名。 我期望最终得到一系列文件名,例如: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等等。有人可以指出我做错了什么吗? Regexp不是我每天的事情。感谢。
$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
答案 0 :(得分:1)
您不需要找到匹配项以便稍后替换它们,这会导致过度替换。你应该在飞行中更换""使用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 demo
请注意,由于您打算替换字符串末尾的数字,因此首选贪婪点匹配"填充。
答案 1 :(得分:0)
我认为除了这行
之外,你的代码还有很多变化$_name .= preg_replace("/\(".$matches[1][0]."\)/", "(".$rbraces.")", $name);
<强> Ideone Demo 强>
<强>解释强>
\d+
与1
匹配,但您的字符串中已存在1
两次。所以它被替换为2702(2)
。
为了与1
具体匹配()
,您需要将其放在正则表达式中,如上所示。