【问题标题】:PHP how to remove the last part of a filename after underscorePHP如何在下划线后删除文件名的最后一部分
【发布时间】:2011-10-03 01:38:41
【问题描述】:

文件名看起来像whatever_test_123234545.gif

什么是删除最后一个下划线后跟所有字符和数字但不是点扩展名的最简单方法。

换句话说,我希望 whatever_test_123234545.gif 看起来像 whatever_test.gif。文件名可以有随机数量的下划线。我只想删除.ext之前的最后一部分。

【问题讨论】:

    标签: php preg-replace explode


    【解决方案1】:

    这将删除最后一个下划线和. 之间的所有内容。如果文件名没有. 或没有_,则不会更改文件名:

    $filename = 'whatever_test_123234545.gif';
    $new_filename = preg_replace('/_[^_.]*\./', '.', $filename);
    

    并实际重命名文件:

    rename($filename, $new_filename);
    

    【讨论】:

    • 这很棒。能否对 preg 表达式做一点解释。
    • @Pinkie 当然! /s 只是开始和结束表达式的分隔符,表达式本身是 _[^_.]*\. 表示找到一个 _ 后跟 0 个或多个不在集合 [_.] 中的字符(所以不是点或一个下划线。\. 只匹配末尾的. 字符。它需要用` since 进行转义。` 在正则表达式中具有特殊含义。由于我们捕获了点,我们将匹配的字符串替换为点也是。
    • 所以它基本上搜索一个下划线后跟尽可能多的既不是下划线也不是点的字符,然后用点替换整个内容。
    • 我只是好奇,为什么我们需要[^_.] 而不仅仅是 [^_]
    • @Pinkie 除非文件名有多个.,否则这无关紧要。但在这种情况下,你可能还是想删除它,所以更好的表达可能是/_[^_]*\./
    【解决方案2】:

    以下代码将替换 .其中 XXX 是任意数字。仅当 XXX 是数字时才会替换。

    $filename = 'whatever_test_56623736373738333.gif';
    $new_filename = preg_replace('/_[0-9]+(\.)/', '.', $filename, 1);
    

    【讨论】:

    • OP 希望删除最后一个下划线,后跟所有字符和数字,而不仅仅是数字。 (PS。已经有类似的answer 满足该要求)
    【解决方案3】:
    $x = 'whatever_test_123234545.gif';    
    $newstring = substr($x, 0, strrpos($x, '_')).substr($x, strrpos($x, '.'));
    

    【讨论】:

    • 这虽然有效,但不如上面的 preg 答案有效。 +1
    【解决方案4】:

    这个将替换 .其中 XXX 是任意字符串。

    <?php 
    echo preg_replace('/_[a-zA-Z0-9]+(\.)/', '.', 'whatever_test_123234545.gif', 1);
    ?>
    // Prints: whatever_test.gif
    

    【讨论】:

    • 谢谢,但最后一部分可以有数字和字符,而不仅仅是数字。
    • 谢谢,但我得到了 1 美元的扩展。 whatever_test$1
    • 嗯。 matt@wraith:~$ echo "&lt;?php echo preg_replace('/_[a-zA-Z0-9]+(\..+)/', '\$1', 'whatever_test_123234545.gif', 1);?&gt;" |php whatever_test.gif
    • 嗯,再次为你更新:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多