【问题标题】:Add suffix to a file name为文件名添加后缀
【发布时间】:2020-04-30 00:16:06
【问题描述】:
$config['file_name'] = preg_replace('/(\.gif|\.jpg|\.png)/', '_thumb$1', $filename);

基本上我希望filename.jpg 变成filename_thumb.jpg

我不明白为什么,但扩展名被重复了两次。 (文件名.jpg.jpg)。

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

【问题讨论】:

  • 您的代码按预期工作: echo preg_replace('/(\.gif|\.jpg|\.png)/', '_thumb$1', 'index.gif'); ps:在表达式末尾添加$。
  • 看这里没有正则表达式的解决方案:stackoverflow.com/questions/2429611/…

标签: php regex


【解决方案1】:

最好的方法可能是......

$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 True, but which ones do?想不出我的头顶...不过我敢肯定有一些极端情况。
  • @Artefacto 我只想到了tar.gz... PHP returns gz。所以我想从扩展的角度来看这可能是不正确的,但如果在最后一次出现句点之后找到字符是正确的。
  • @Artefacto 哪些扩展包含括号?
  • @alex 对于名为 foo.tar.gz 的文件,gz 如何不正确;这不是压缩文件吗?
【解决方案2】:

应该可以。

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

filename_thumb.jpg

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

【讨论】:

  • 如果没有括号,他将无法在不为每个扩展名复制粘贴的情况下指定 $
  • @zerkms 好点。但他可以改用(?:)。真的没有必要使用捕获组。
【解决方案3】:

也许最好在构建方法中使用 PHP,例如 pathinfobasename。 这将处理所有类型的文件,包括没有扩展名的文件

$extension = pathinfo($filename, PATHINFO_EXTENSION);
$baseName = basename($filename, ".{$extension}");
$newName = "{$baseName}_thumb.{$extension}";

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多