/**获得文件扩展名**/
  function get_extention()
  {
    $this->extention = preg_replace('/.*\.(.*[^\.].*)*/iU','\\1',$this->upfile_name); //取得文件扩展名;
  } 
哪位能详解这段正则表达式。
谢谢!!

解决方案 »

  1.   

    比如 abc.def.php这个文件名,第一个 ".*" 匹配 abc.def
    \.是小数点的转义,匹配abc.def后的小数点
    (.*[^\.].*)这里是子模式,表示至少有一个不为小数点的任意字符,匹配php,也就是文件扩展名
    \\1取得第一个子模式的值也就是文件扩展名php讲的不好,大楷就是这意思
      

  2.   

    <?php/**
    * finfo($path) : 根据文件路径获取文件名及其扩展名
    * @param (string): 绝对路径 或者 相对路径 或者 一个完整的文件名
    * @return (array): 数组$ary; $ary[0] 和$ary['filename']表示文件名;$ary[1] 和$ary['extname']表示后缀名; 
    */
    function finfo($path) {//判断路径分割符号 windows '\' 或者 unix & linux '/'
    $sp = (strrpos($path , '/') !== false) ? '/' : '\\';if(strpos($path , $sp) === false){
      
       if( 0 < strrpos($path , '.')){    $pos = strrpos($path , '.');    $ary = array(substr($path , 0 , $pos) ,substr($path , $pos , strlen($path) - 1));   } else {
      
        $ary = array( $path , '');
       }   //新增两个带键值的项,以便于应用和记忆
       $ary['filename'] = $ary[0];
       $ary['extname'] = $ary[1];   return $ary;} else {
       //递归调用
       return finfo(basename($path));
    }
    }$ary = array(
    '/etc/passwd'
    ,'/etc/httpd/conf/httpd.conf'
    ,'d:\www.html'
    ,'index.aspx'
    ,'d:\www\html\pag.utility\cad.php'
    ,'/etc/vsftp/conf/ftp.conf.bak' // 在这种情况下,将ftp.conf当成文件名,.bak当成扩展名 
    ,'/etc/vsftp/conf/.ftp.conf.bak' // 在这种情况下,将.ftp.conf当成文件名,.bak当成扩展名 
    ,'/home/testuser/.gnome/.conf' // 在linux或者unix中这种情况下.conf不能当成是扩展名
    );header('Content-Type:text/html;charset=utf-8');
    //测试函数的正确性
    foreach($ary as $key => $record) {$t = finfo($record);$ary[$key] = '<tr><td>' . $record . ' </td><td>' . $t['filename'] . '</td><td>' . $t['extname'] . '</td>';}echo '<table><tr><td>路径 (filepath)</td><td>文件名 (filename)</td><td>后缀名 (ext_name)</td></tr>' , join($ary , '') , '</table>';?>