PHP重命名文件,从特殊名称开始?

时间:2014-07-09 01:51:05

标签: php regex printf scanf

我想重命名数据库中的文件。所以......我写道。 除了长度为int的名称外,它的工作正常。 (例如:bartmp_9404865346.jpg不起作用,但bartmp_585558.jpg正在运作)

$subject = '[img]http://www.example.org/users/uploads/bartmp_9404865346.jpg[/img]
            Hello world
            [img]http://www.example.org/users/uploads/bartmp_585558.jpg[/img]';

preg_match_all('/\[img\](.*?)\[\/img\]/', $subject, $files);


foreach ($files[1] as $file) {
  $n = sscanf($file, "http://www.example.org/users/uploads/bartmp_%d.jpg");
  $refile = sprintf("http://www.example.org/users/uploads/mybar_%d.jpg", $n[0]);
  rename($file, $refile);
}

你可以给我任何改变方法来做这个或一点提示来修改它。 感谢。

2 个答案:

答案 0 :(得分:4)

%d格式说明符只接受适合整数的数字(取决于平台为2 ^ 31或2 ^ 63);在不失精度的情况下,正则表达式可能会更好:

if (preg_match('#^http://www.example.org/users/uploads/bartmp_(\d+)\.jpg$#', $file, $matches)) {
    $refile = sprintf('http://www.example.org/users/uploads/mybar_%s.jpg', $matches[1]);
    rename($file, $refile);
}

上面的表达式只匹配数字,但将匹配项存储为字符串值,因此不会失去数字精度。

答案 1 :(得分:1)

您正在使用%d表示十分正确的小数:

$n = sscanf($file, "http://www.example.org/users/uploads/bartmp_%d.jpg");
$refile = sprintf("http://www.example.org/users/uploads/mybar_%d.jpg", $n[0]);

问题是PHP中的最大数值 - 以及编译为32位的其他语言是2147483647,因此9404865346将无法飞行。相反,您应该将值提取为字符串,而不是像这样:

$n = sscanf($file, "http://www.example.org/users/uploads/bartmp_%s.jpg");
$refile = sprintf("http://www.example.org/users/uploads/mybar_%s", $n[0]);