Php 为文件名添加后缀

Php 为文件名添加后缀,php,regex,Php,Regex,基本上我希望filename.jpg变成filename\u thumb.jpg 我不明白为什么,但这个扩展被重复了两次。(filename.jpg.jpg) 编辑这确实有效,我的代码中还有其他问题。应该有效 $config['file_name'] = preg_replace('/(\.gif|\.jpg|\.png)/', '_thumb$1', $filename); 给出filename\u thumb.jpg 在任何情况下,请使用表达式”/(\.gif\.jpg\.png)$/”(

基本上我希望
filename.jpg
变成
filename\u thumb.jpg

我不明白为什么,但这个扩展被重复了两次。(filename.jpg.jpg)

编辑这确实有效,我的代码中还有其他问题。

应该有效

$config['file_name'] = preg_replace('/(\.gif|\.jpg|\.png)/', '_thumb$1', $filename);
给出
filename\u thumb.jpg


在任何情况下,请使用表达式
”/(\.gif\.jpg\.png)$/”
(最好不要使用括号并将$1替换为$0),这样它只在字符串末尾匹配字符串。

最好的方法可能是

echo preg_replace('/(\.gif|\.jpg|\.png)/', '_thumb$1', "filename.jpg");
我刚刚用
$filename='path/to/something.jpg'测试了它输出为
path/to/something\u thumb.jpg


我说这是最好的方法,因为通常使用PHP的内置函数更好。这还允许PHP可以处理的所有文件扩展名(字符串拆分,应该是全部)。

最好使用PHP的内置方法,例如
pathinfo
basename
。 这将处理所有类型的文件,包括没有扩展名的文件

$filename_ext = pathinfo($filename, PATHINFO_EXTENSION);

$filename = preg_replace('/^(.*)\.' . $filename_ext . '$/', '$1_thumb.' . $filename_ext, $filename);

您的代码按预期工作:echo preg\u replace(“/(\.gif\.jpg\.png)/”、“\u thumb$1”、“index.gif”);ps:在表达式末尾添加$。请参见此处,了解没有正则表达式的解决方案:如果没有括号,他将无法指定$,除非为每个表达式复制粘贴它extension@zerkms说得好。但是他可以用
(?:)
来代替。真的不需要使用捕获组。对于包含在正则表达式中有意义的字符的扩展名呢?。@Artefactor True?想不出我头顶上的任何东西。。。不过我肯定有一些边缘情况。@artifact我刚刚想到了
tar.gz
<代码>gz
仅限。因此,我想从扩展名的角度来看,这可能不正确,但如果在句点的最后一次出现之后找到字符,则是正确的。@artifact哪些扩展名包含括号?@alex
gz
对于名为
foo.tar.gz
的文件来说是不正确的;它不是gzip文件吗?
$extension = pathinfo($filename, PATHINFO_EXTENSION);
$baseName = basename($filename, ".{$extension}");
$newName = "{$baseName}_thumb.{$extension}";