【发布时间】:2011-10-03 01:38:41
【问题描述】:
文件名看起来像whatever_test_123234545.gif。
什么是删除最后一个下划线后跟所有字符和数字但不是点扩展名的最简单方法。
换句话说,我希望 whatever_test_123234545.gif 看起来像 whatever_test.gif。文件名可以有随机数量的下划线。我只想删除.ext之前的最后一部分。
【问题讨论】:
标签: php preg-replace explode
文件名看起来像whatever_test_123234545.gif。
什么是删除最后一个下划线后跟所有字符和数字但不是点扩展名的最简单方法。
换句话说,我希望 whatever_test_123234545.gif 看起来像 whatever_test.gif。文件名可以有随机数量的下划线。我只想删除.ext之前的最后一部分。
【问题讨论】:
标签: php preg-replace explode
这将删除最后一个下划线和. 之间的所有内容。如果文件名没有. 或没有_,则不会更改文件名:
$filename = 'whatever_test_123234545.gif';
$new_filename = preg_replace('/_[^_.]*\./', '.', $filename);
并实际重命名文件:
rename($filename, $new_filename);
【讨论】:
/s 只是开始和结束表达式的分隔符,表达式本身是 _[^_.]*\. 表示找到一个 _ 后跟 0 个或多个不在集合 [_.] 中的字符(所以不是点或一个下划线。\. 只匹配末尾的. 字符。它需要用` since 进行转义。` 在正则表达式中具有特殊含义。由于我们捕获了点,我们将匹配的字符串替换为点也是。
[^_.] 而不仅仅是 [^_]
.,否则这无关紧要。但在这种情况下,你可能还是想删除它,所以更好的表达可能是/_[^_]*\./
以下代码将替换 .其中 XXX 是任意数字。仅当 XXX 是数字时才会替换。
$filename = 'whatever_test_56623736373738333.gif';
$new_filename = preg_replace('/_[0-9]+(\.)/', '.', $filename, 1);
【讨论】:
$x = 'whatever_test_123234545.gif';
$newstring = substr($x, 0, strrpos($x, '_')).substr($x, strrpos($x, '.'));
【讨论】:
这个将替换 .其中 XXX 是任意字符串。
<?php
echo preg_replace('/_[a-zA-Z0-9]+(\.)/', '.', 'whatever_test_123234545.gif', 1);
?>
// Prints: whatever_test.gif
【讨论】:
whatever_test$1
matt@wraith:~$ echo "<?php echo preg_replace('/_[a-zA-Z0-9]+(\..+)/', '\$1', 'whatever_test_123234545.gif', 1);?>" |php whatever_test.gif