我想重命名数据库中的文件。所以......我写道。
除了长度为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);
}
你可以给我任何改变方法来做这个或一点提示来修改它。 感谢。
答案 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]);