给文件名添加后缀

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

基本上我想要filename.jpg变成filename_thumb.jpg

我不明白为什么扩展名会重复两次。(filename.jpg.jpg)。

编辑这是有效的,我的代码有其他问题。


你的代码按预期工作:echo preg_replace('/(.gif|.jpg|.png)/', '_thumb$1', 'index.gif'); 附注: 在表达式末尾添加 $。 - zerkms
请参考以下不使用正则表达式的解决方案: https://dev59.com/TXE95IYBdhLWcg3wKqsk - Matthew
preg_replace('/(?=\.)/', '_thumb', $filename, 1); 我觉得看起来不错。 - mickmackusa
啊,我同意Matthew的看法,这是一个重复的问题,链接为https://dev59.com/TXE95IYBdhLWcg3wKqsk。 - mickmackusa
4个回答

11

最好的方法可能是...

$filename_ext = pathinfo($filename, PATHINFO_EXTENSION);

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

我刚测试了一下,使用$filename = 'path/to/something.jpg';,输出结果是path/to/something_thumb.jpg

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


扩展名中包含正则表达式中有意义的字符怎么办? - Artefacto
@Artefacto 确实如此,但是哪些呢?我暂时想不出来任何一个...虽然肯定有一些边缘情况。 - alex
@Artefacto 我刚想到 tar.gz... PHP returns 只有 gz。所以我猜从扩展名的角度来看可能不正确,但如果查找最后一个句点后面的字符,则是正确的。 - alex
@Artefacto 哪些扩展名包含括号? - alex
@alex,如果文件名为 foo.tar.gz,那么为什么 gz 不正确?它不是一个被压缩的文件吗? - salathe
@alex https://dev59.com/TXE95IYBdhLWcg3wKqsk#75505259 关于tar.gz - kkasp

6

应该能正常工作。

echo preg_replace('/(\.gif|\.jpg|\.png)/', '_thumb$1', "filename.jpg");

提供filename_thumb.jpg

无论如何,使用表达式'/(\.gif|\.jpg|\.png)$/'(最好不要使用括号,并将$1替换为$0),这样只有在字符串位于末尾时才匹配它。


如果没有括号,他将无法指定 $ 符号而不需要为每个扩展复制粘贴它。 - zerkms
@zerkms 说得好。但是他可以使用 (?:)。真的没有必要使用捕获组。 - Artefacto

2
也许最好使用PHP的内置方法,例如pathinfobasename。这将处理所有类型的文件,包括没有扩展名的文件。原始答案:最初的回答。
$extension = pathinfo($filename, PATHINFO_EXTENSION);
$baseName = basename($filename, ".{$extension}");
$newName = "{$baseName}_thumb.{$extension}";

0

最短 & 最快

$img = '/path/to/picture.jpg';
$thumb = substr_replace( $img, '_thumb.', strrpos($img, '.'), 1);
echo $thumb;
// /path/to/picture_thumb.jpg

一些教育性的解释总比没有教育性的解释好。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接