2016-12-23 14 views
1

ファイル名はDona&ld #Duck .jpgです。 .jpgやファイル拡張子の前にあるすべての特殊文字を_(アンダースコア)に置き換えたいと思います。 出力はDon_a_ld__Duck__.jpgファイル拡張子を無視してファイル名を処理するpreg_replaceを作成するにはどうすればよいですか?

どのようにpreg_replaceを使用してこれを達成する必要がありますか?私は次のようにしました。

$fileName ='Don.a&ld #Duck .jpg'; 
$fileName = trim($fileName); 
$fileExtension = substr($fileName,-4); 
$fileName = substr($fileName,0,-4); // file name without extension 
echo $filename = preg_replace('/[^a-z0-9]/i', '_', $fileName).$fileExtension; 

ファイル拡張子を別途追加したくありません。

答えて

2

最後のドットを保護し、負の先読みと、次のソリューションを使用します。

$fileName ='Don.a&ld #Duck .jpg'; 
echo $filename = preg_replace('/[^a-z0-9](?![^.]*$)/i', '_', $fileName); 
              ^^^^^^^^^ 

は、特殊な文字が続いている場合PHP demo

(?![^.]*$)はただ試合を失敗したを参照してください。文字列の最後までドット以外の0以上の文字。

/[^a-z0-9]/i_と一致し、冗長操作である_と置き換えられます。 \Wサブパターンで避けることができます:

2

あなたは先読み正規表現を使用することができます。

$fileName = preg_replace('/\W(?=.*\.[^.]+$)/', '_', $fileName); 
//=> Dona_ld__Duck__.jpg 

\W(?=.*\.[^.]+$)はDOTと任意の拡張子が続いている非単語文字と一致します。

RegEx Demo

関連する問題