PHP - 如何在点扩展名之前增加大括号内的文件名ID?

时间:2016-04-27 18:28:26

标签: php regex preg-replace

我有一个文件会不时得到修改,我需要在每次对文件进行新的更改时跟踪文件名。 我期望最终得到一系列文件名,例如: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

2 个答案:

答案 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具体匹配(),您需要将其放在正则表达式中,如上所示。