我正在尝试删除上传文件的扩展名,只留下文件名。我遇到了一些可以帮助我完成此操作的代码,虽然我在理解其工作原理时遇到了问题。
代码:
$filename=substr($filepath,strpos($filepath,'.'),strlen($filepath)-4);
这是代码返回的内容
..\Images\1\item\ITEMDPTEST 9\52b5aa6ec2ca29.42555484
这是我正在使用的原始文件名
..\Images\1\item\ITEMDPTEST 9\52b5aa6ec2ca29.42555484.jpg
从PHP手册中,substr函数返回由start和length参数指定的字符串部分,该参数分别由strpos和strlen函数定义。
据我所知,strpos和strlen函数用于生成start和length参数所需的数字,但却被它搞糊涂了。
混乱#1
从strpos函数可以看出,我们试图返回第一个'。'的数字索引。发生在文件名中,在这种情况下将是'。'这是在文件名的中间,但为什么它使用'。'的位置。在扩展中使用?
52b5aa6ec2ca29**.**42555484 <-- the period is surrounded by asterisks.
混乱#2
从PHP手册
If length is given and is positive, the string returned will contain at most length characters beginning from start (depending on the length of string).
从上面的代码示例中我们可以看到,strlen函数返回的值将是正数,因此不应该从从'''开始的substr返回的值。到文件名的末尾,因此会导致返回扩展名?
然而,我们可以看到情况并非如此,文件名是返回的文件名。
如果有人能向我解释代码,我将不胜感激。
P.S文件名是使用uniqid(“”,true);
生成的答案 0 :(得分:0)
如果您的文件路径为..\Images\1\item\ITEMDPTEST 9\52b5aa6ec2ca29.42555484.jpg
,则您的第一个.
不在中间,但实际上是$filepath
的第一个字符。
strpos($filepath,'.')
返回0
。
strlen($filepath)-4
返回$filepath
的长度减去4个字符。
您的substr()
看起来像这样,扩展了变量:
$filename = substr($filepath, 0, 53);
所有这些意味着$filename
是$filepath
减去4个字符。如果文件扩展名超过三个字符,这种事情会给你带来麻烦。 file.jpeg
将返回file.
。因此,您应始终使用pathinfo()
。
$filename = pathinfo($filepath, PATHINFO_FILENAME);