ImaginedDesign
ImaginedDesign

Reputation: 303

Remove all dots in filename except the dot before the file extension

I am trying to sanitize a filename.

I would like to know of a way to remove all decimals from a files name except the last one. I need to keep the last one because the extension follows that.

EXAMPLE:

abc.def.ghij-klmnop.q234.mp3

This file should look like

abcdefghij-klmnopq234.mp3

Some extensions are longer than 3 characters.

Upvotes: 3

Views: 2040

Answers (4)

Matthew
Matthew

Reputation: 48304

Assuming $s is the name of the file.

$s = (($i = strrpos($s, '.')) === false) ? $s :
    str_replace('.','',substr($s,0,$i)).substr($s,$i);

Upvotes: 2

Asaph
Asaph

Reputation: 162831

You can use a regex with a positive lookahead. Like this:

$withdots = 'abc.def.ghij-klmnop.q234.mp3';
$nodots = preg_replace('/\.(?=.*\.)/', '', $withdots);

After executing the above, $nodots will contain abcdefghij-klmnopq234.mp3. The regular expression is basically saying match all periods that are followed by another period. So the last period won't match. We replace all matches with an empty string, and we're left with the desired result.

Upvotes: 12

Geoffrey
Geoffrey

Reputation: 11354

You could also do this, it should be faster then using pathinfo & str_replace.

$parts  = explode('.', 'abc.def.ghij-klmnop.q234.mp3');
$ext    = array_pop($parts);
$nodots = implode('', $parts) . '.' . $ext;

Upvotes: 4

netcoder
netcoder

Reputation: 67735

That should do it:

$file = 'abc.def.ghij-klmnop.q234.mp3';
$parts = pathinfo($file);
$filename = str_replace('.', '', $parts['filename']).'.'.$parts['extension'];

Upvotes: 9

Related Questions