/**获得文件扩展名**/
function get_extention()
{
$this->extention = preg_replace('/.*\.(.*[^\.].*)*/iU','\\1',$this->upfile_name); //取得文件扩展名;
}
哪位能详解这段正则表达式。
谢谢!!
function get_extention()
{
$this->extention = preg_replace('/.*\.(.*[^\.].*)*/iU','\\1',$this->upfile_name); //取得文件扩展名;
}
哪位能详解这段正则表达式。
谢谢!!
\.是小数点的转义,匹配abc.def后的小数点
(.*[^\.].*)这里是子模式,表示至少有一个不为小数点的任意字符,匹配php,也就是文件扩展名
\\1取得第一个子模式的值也就是文件扩展名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>';?>