frename PHP 灵活文件命名函数 frename

  对付这种情况,有的做法是用时间戳对新文件进行重新命名,有的是用序号递增的方法,为了解决麻烦的操作,我在最近编写了一个frename函数,可以灵活依据自定义的规则取得上传文件的新命名,特此分享。

  

复制代码 代码如下:

  <?php

  function frename($file, $rule='{timestamp}', $force = true) {

  /* -----------------------

  * author: m35

  * date: 2009/8/11

  * 依据命名规则取得文件的新命名,以处理上传文件等操作时遇到的文件名已存在的情况

  * @parm1 $file -- 文件物理路径

  * @parm2 $rule -- 命名规则, 默认为时间戳

  * @parm3 $force -- 是否强制命名,如果是强制,就算该目标文件不存在也会对其进行命名,默认强制

  * retrun str -- 依据$rule命名的新文件路径

  * 示例:

  echo '默认规则(时间戳):' . frename(__FILE__);

  echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');

  echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');

  echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');

  echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');

  echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');

  echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');

  ----------------------- */

  if (!$force && !file_exists($file)) return $file;

  $filename = basename($file);

  $path = str_replace($filename, '', $file);

  $suffix = substr($filename, strrpos($filename, '.'));

  $name = str_replace($suffix, '', $filename);

  $timestamp = time();

  list($y, $Y, $m, $M, $d, $D, $h, $H, $i, $s) = explode(',', date('Y,y,m,n,d,j,h,G,i,s'));

  $tempname = str_replace(

  array('{name}', '{timestamp}', '{y}', '{Y}', '{m}', '{M}', '{d}', '{D}', '{h}', '{H}', '{i}', '{s}'),

  array($name, $timestamp, $y, $Y, $m, $M, $d, $D, $h, $H, $i, $s),

  $rule

  );

  if (preg_match('/\{(\d?)n\}/', $rule, $n)) {

  preg_match('/<([^>]+)>/', $tempname, $sep);

  $file = $path . str_replace(array($n[0], $sep[0]), array('', ''), $tempname) . $suffix;

  if (!file_exists($file)) return $file;

  $tempname = str_replace($sep[0], $sep[1], $tempname);

  $tname = $tempname;

  $i = 1;

  do {

  $nn = sprintf("%0{$n[1]}s", $i);

  $tempname = str_replace($n[0], $nn, $tname);

  $file = $path . $tempname . $suffix;

  }

  while (file_exists($file));

  return $file;

  } else {

  $file = $path . $tempname . $suffix;

  if (file_exists($file)) return false;

  else return $path . $tempname . $suffix;

  }

  }

  echo '默认规则(时间戳):' . frename(__FILE__);

  echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');

  echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');

  echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');

  echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');

  echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');

  echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');

  ?>