查询一段代码

时间:2013-12-21 16:02:44

标签: php substring

我正在尝试删除上传文件的扩展名,只留下文件名。我遇到了一些可以帮助我完成此操作的代码,虽然我在理解其工作原理时遇到了问题。

代码:

$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);

生成的

1 个答案:

答案 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);