除文件扩展名前的点外,删除文件名中的所有点。

3

我正在尝试对文件名进行清理。

我想知道如何从文件名中除了最后一个以外,删除所有小数点。我需要保留最后一个小数点,因为它之后是文件的扩展名。

示例:

abc.def.ghij-klmnop.q234.mp3

这个文件应该看起来像这样:
abcdefghij-klmnopq234.mp3

一些扩展名长度超过3个字符。

4个回答

12

您可以使用带有正向前瞻的正则表达式。像这样:

$withdots = 'abc.def.ghij-klmnop.q234.mp3';
$nodots = preg_replace('/\.(?=.*\.)/', '', $withdots);
执行上述代码后,$nodots将包含abcdefghij-klmnopq234.mp3。这个正则表达式的意思是匹配所有后面跟着另一个句点的句点。所以最后一个句点不会匹配。我们用空字符串替换所有匹配项,最终得到所需的结果。

9
那应该就可以了:
$file = 'abc.def.ghij-klmnop.q234.mp3';
$parts = pathinfo($file);
$filename = str_replace('.', '', $parts['filename']).'.'.$parts['extension'];

2
最容易阅读的解决方案,但如果文件没有扩展名,则无法正常工作。 - Matthew

4
您还可以这样做,这应该比使用pathinfo和str_replace更快。
$parts  = explode('.', 'abc.def.ghij-klmnop.q234.mp3');
$ext    = array_pop($parts);
$nodots = implode('', $parts) . '.' . $ext;

2
假设$s是文件的名称。
$s = (($i = strrpos($s, '.')) === false) ? $s :
    str_replace('.','',substr($s,0,$i)).substr($s,$i);

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