PHP,将字符串添加到文件名

3

我有两个变量:

$lang = hu

$image = image.jpg

如何在php中将image.jpg替换为image_hu.jpg?也许可以用str_replace实现?但是如何操作呢?
4个回答

6

这种方法适用于任何文件类型,以及具有多个句点的图像名称。(演示

代码

<?php 

    echo merge('image.test.1234.gif', '_en');

    function merge($file, $language){
        $ext = pathinfo($file, PATHINFO_EXTENSION);
        $filename = str_replace('.'.$ext, '', $file).$language.'.'.$ext;
        return ($filename);
    }
?>

结果

image.test.1234_en.gif

如果文件名中有额外的点,比如:recent.image.jpg,那么这个方法就会失效。结果会变成 recent_hu.image.jpg - stevecomrie
抱歉,你可能遇到了我的更新中间阶段。现在已经更新完毕,可以正常工作了。 - Dutchie432
如果文件名中包含$ext,则此操作将失败:'image.gift.1234.gif' - raveren
@stevecomrie,试试这个,快速且可以修正显示,https://dev59.com/TXE95IYBdhLWcg3wKqsk#75505259 - kkasp

5

使用preg_replace会很好地工作:

$new_str = preg_replace('/(\.[^.]+)$/', sprintf('%s$1', $lang), $image);

好吧。如果文件名有多个“.”,比如image.test.png会怎么样? - Dutchie432
我确定文件名和扩展名,所以第一个例子对我有效。我编辑了问题:$lang没有下划线字符。我修改了第一个示例,它可以工作,但是当我想使用更通用的版本'/.[a-z0-9]+$/'时,我需要修改什么? - Adrian
str_replace( '.', '_hu.', $image ) - Galen
1
@Galen - 再次强调,这仅适用于只有一个“.”的文件。因此,在这方面,它与被接受的答案一样有效。 - Dutchie432
@Dutchie432 - 对的,他说他控制文件名,所以两个答案都可以。如果不必要,我只是更喜欢不使用正则表达式。 - Galen
显示剩余2条评论

3

另一个选择是使用内置函数pathinfo,从文件名中分离文件扩展名。

$path_parts = pathinfo('image.jpg');

$final = $path_parts['filename'] . $lang . '.' . $path_parts['extension'];

1
我认为这实际上比任何基于正则表达式的解决方案更易读。 - stevecomrie

2
我会使用以下内容:
$new_str = preg_replace( '/^(.*?)\.(\w+)$/', '${1}$lang.${2}', $image );

那样你的代码仍将适用于JPG/gif/jpeg/PNG等。

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