php获取文件扩展名
2011-10-10 14:42
274 查看
最近看到网友分享的一段代码,使用php获取文件扩展名的,这个问题是一个比较经典的问题,于是搜了一些相关文章,然后总结评测如下:
前五种都是使用字符串函数处理的方式获取扩展名,而第六种是使用Filesystem函数获取的。
获取文件扩展名需要考虑几种情况:
无文件扩展名
路径里包含字符”.”,例如”/abc/def.g/123.txt”
路径里包含字符”.”,但文件没有扩展名,例如”/abc/def.g/123″
第一种方法测试正常,不显示任何内容
第二种显示异常,显示内容:/abc/def/gkl
第三种显示异常,显示内容:/abc/def/gkl
第四种显示异常,显示内容:/abc/def/gkl
第五种测试正常,不显示任何内容
第六种测试正常,不显示任何内容
程序实现设计上,第一种 扩展名默认为空 ,然后找 “.” ,没找到就不执行接下来的截取扩展名操作,找到后就执行,执行后会把扩展名赋值给保存扩展名的变量,然后返回
第二种异常的原因,归咎于使用的函数explode,它使用 ‘.’ 来分隔字符串,没找到就会把整个字符串返回为数组元素,然后end返回数组元素,所以会显示全路径
第三种原因同上
第四种原因类似与第一种,没有找到 ‘.’ ,会直接返回传递过来的参数,而不会执行while循环
第五种测试正常的原因是因为trim这个函数,strrchr($path,’.'),跟substr( strrchr($path,’.'),1 )返回结果都为false,然后使用trim函数,正常了!然后就显示空 if( trim(false)==null ){ echo “OK”; } 显示为ok
第六种为使用文件系统函数,返回扩展名,没有就不会显示吧
第一种方法测试正常,显示txt
第二种方法测试正常,显示txt
第三种方法测试正常,显示txt
第四种方法测试正常,显示txt
第五种方法测试正常,显示txt
第六种方法测试正常,显示txt
这种方法使用了strrpos函数,返回’.'最后一次出现的位置,然后据此进行的处理,所以路径中包含’.'无影响
这种方法根据’.'把字符串分离为数组元素,然后返回最后一个元素的值,如果文件有扩展名的话,必然在最后一个元素里,所以测试正常
这种方法跟上一种原理相同
这种方法使用while循环从第一个’.'不断截取’.'后的内容,知道最后一个’.’ ,如果文件有扩展名的话 ,循环结束后变量里保存的也就是文件扩展名了
这种方法使用strrchr获取最后一次’.'出现的字符串,然后去除’.’ ,如果文件有扩展名的话,得到扩展名
这种方法使用文件系统函数,返回扩展名,正常
显示异常,显示g/123
显示异常,显示g/123
显示异常,显示g/123
显示异常,显示g/123
显示异常,显示g/123
正常,无显示
前5种方法都是根据’.'的位置来判断文件扩展名,如果’.'出现在文件夹名里,而文件无扩展名,程序会把.出现后的字符串全部当作扩展名
最后一种方法为系统自带的文件系统函数,应该有考虑这些情况
另外,使用pathinfo来获取文件扩展名,如果用在接受用户查询的情况下,还需要考虑一个问题:路径包含查询字符串的参数里含有’.'(例如eg. &x.1=2&y.1=5),所以接下来这个函数首先消除了查询字符串,之后再进行了处理,代码如下:
好了,分析完了,原来除了使用系统自带函数实现的第六种方法外,全部存在问题,接下来博主会根据各种情况再写一些修正处理来完善前五种函数,博主也是php的初学者,欢迎板砖,把您的观点一件分享出来,大家一起进步!
ps:
给大家补一点扩展名的小知识(清楚者跳过):
扩展名的用途
:文件扩展名可以帮助计算机使用者辨别文件的类型,也可以帮助计算机将文件分类,并标识这一类拓展名的文件用什么程序去打开。
文件扩展名不是一个文件的必要构成部分
:任何一个文件可以有或没有扩展名。对于打开文件操作,没有扩展名的文件需要选择程序去打开它,有扩展名的文件会自动用设置好的程序(如有)去尝试打开(是“尝试打开”,而不是“打开”),文件扩展名是一个常规文件的构成部分,但一个文件并不一定需要一个扩展名
文件扩展名并没有表明该文件是何种类型
:文件扩展名可以人为设定,扩展名为TXT的文件有可能是一张图片,同样,扩展名为MP3的文件,依然可能是一个视频。
第一种:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php //获取文件扩展名 //substr(strrchr(' name.txt ', '.'), 1); //http://www.oschina.net/code/snippet_96289_4951#commentform function FileExtension($fstr){ $retval = ''; $pt = strrpos($fstr, "."); if ($pt!==false) $retval = substr($fstr, $pt+1, strlen($fstr) - $pt-1); return ($retval); } $file_extension = FileExtension("/abc/def.g/123"); print_r($file_extension); ?> |
第二种:
1 2 3 4 5 6 7 | <?php function file_extension($filename) { return end(explode(".", $filename)); } $filename = file_extension('/www/music/kevin.jpeg.mp3'); echo $filename; ?> |
第三种:
1 2 3 4 5 6 78 | <?php function file_extension( $filename ){ $extend = explode(".",$filename); $va = count( $extend )-1; return $extend[$va]; } $filename = file_extension( 'name.txt' ); echo $filename; ?> |
第四种:
1 2 3 4 5 6 78 | <?php function getFileExt($file_name){ while($dot = strpos($file_name, ".")){ $file_name = substr($file_name, $dot+1); } return $file_name; } $filename = getFileExt('name.txt'); echo $filename; ?> |
第五种:
1 2 3 4 5 6 78 | <?php /* * description: getFileExt - 获取文件扩展名 * parm: $path - 目录路径 * return: string */ function getFileExt( $path ){ return strtolower( trim( substr( strrchr($path,'.'),1 ) ) ); } $filename = getFileExt('kevin.jpeg.mp3'); echo $filename; ?> |
第六种:
1 2 3 | <?php echo pathinfo('name.txt',PATHINFO_EXTENSION); ?> |
获取文件扩展名需要考虑几种情况:
无文件扩展名
路径里包含字符”.”,例如”/abc/def.g/123.txt”
路径里包含字符”.”,但文件没有扩展名,例如”/abc/def.g/123″
第一项测试(给定文件路径为/abc/def/gkl):
第一种方法测试正常,不显示任何内容第二种显示异常,显示内容:/abc/def/gkl
第三种显示异常,显示内容:/abc/def/gkl
第四种显示异常,显示内容:/abc/def/gkl
第五种测试正常,不显示任何内容
第六种测试正常,不显示任何内容
分析原因
程序实现设计上,第一种 扩展名默认为空 ,然后找 “.” ,没找到就不执行接下来的截取扩展名操作,找到后就执行,执行后会把扩展名赋值给保存扩展名的变量,然后返回第二种异常的原因,归咎于使用的函数explode,它使用 ‘.’ 来分隔字符串,没找到就会把整个字符串返回为数组元素,然后end返回数组元素,所以会显示全路径
第三种原因同上
第四种原因类似与第一种,没有找到 ‘.’ ,会直接返回传递过来的参数,而不会执行while循环
第五种测试正常的原因是因为trim这个函数,strrchr($path,’.'),跟substr( strrchr($path,’.'),1 )返回结果都为false,然后使用trim函数,正常了!然后就显示空 if( trim(false)==null ){ echo “OK”; } 显示为ok
第六种为使用文件系统函数,返回扩展名,没有就不会显示吧
第二项测试(给定文件路径为/abc/def.g/123.txt)
第一种方法测试正常,显示txt第二种方法测试正常,显示txt
第三种方法测试正常,显示txt
第四种方法测试正常,显示txt
第五种方法测试正常,显示txt
第六种方法测试正常,显示txt
分析原因
这种方法使用了strrpos函数,返回’.'最后一次出现的位置,然后据此进行的处理,所以路径中包含’.'无影响这种方法根据’.'把字符串分离为数组元素,然后返回最后一个元素的值,如果文件有扩展名的话,必然在最后一个元素里,所以测试正常
这种方法跟上一种原理相同
这种方法使用while循环从第一个’.'不断截取’.'后的内容,知道最后一个’.’ ,如果文件有扩展名的话 ,循环结束后变量里保存的也就是文件扩展名了
这种方法使用strrchr获取最后一次’.'出现的字符串,然后去除’.’ ,如果文件有扩展名的话,得到扩展名
这种方法使用文件系统函数,返回扩展名,正常
第三项测试(给定文件路径为/abc/def.g/123)
显示异常,显示g/123显示异常,显示g/123
显示异常,显示g/123
显示异常,显示g/123
显示异常,显示g/123
正常,无显示
分析原因
前5种方法都是根据’.'的位置来判断文件扩展名,如果’.'出现在文件夹名里,而文件无扩展名,程序会把.出现后的字符串全部当作扩展名最后一种方法为系统自带的文件系统函数,应该有考虑这些情况
另外,使用pathinfo来获取文件扩展名,如果用在接受用户查询的情况下,还需要考虑一个问题:路径包含查询字符串的参数里含有’.'(例如eg. &x.1=2&y.1=5),所以接下来这个函数首先消除了查询字符串,之后再进行了处理,代码如下:
1 2 3 4 5 6 78 | <?php function extension($path) { $qpos = strpos($path, "?"); if ($qpos!==false) $path = substr($path, 0, $qpos); $extension = pathinfo($path, PATHINFO_EXTENSION); return $extension; } ?> |
ps:
给大家补一点扩展名的小知识(清楚者跳过):
扩展名的用途
:文件扩展名可以帮助计算机使用者辨别文件的类型,也可以帮助计算机将文件分类,并标识这一类拓展名的文件用什么程序去打开。
文件扩展名不是一个文件的必要构成部分
:任何一个文件可以有或没有扩展名。对于打开文件操作,没有扩展名的文件需要选择程序去打开它,有扩展名的文件会自动用设置好的程序(如有)去尝试打开(是“尝试打开”,而不是“打开”),文件扩展名是一个常规文件的构成部分,但一个文件并不一定需要一个扩展名
文件扩展名并没有表明该文件是何种类型
:文件扩展名可以人为设定,扩展名为TXT的文件有可能是一张图片,同样,扩展名为MP3的文件,依然可能是一个视频。
相关文章推荐
- php获取文件名称和扩展名
- php获取文件名称和扩展名
- PHP获取文件扩展名
- php从给定url获取文件扩展名的方法
- PHP中 获取文件扩展名的N种方法
- PHP获取文件扩展名(后缀)的6种方法
- php 获取唯一字符串与文件扩展名函数
- PHP中获取文件扩展名的N种方法小结
- PHP获取文件扩展名的方法
- PHP获取文件扩展名的4种方法
- PHP获取文件扩展名的方法
- PHP中 获取文件扩展名的N种方法
- PHP中获取文件扩展名的N种方法小结
- PHP获取文件扩展名(后缀)
- PHP获取文件扩展名的多种方法
- php获取上传文件扩展名的方法
- PHP获取文件扩展名的五种方式
- PHP获取文件扩展名的常用方法小结【五种方式】
- php获取文件扩展名多种方法
- PHP中 获取文件扩展名的N种方法