2016-12-23 116 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子模式避開它:

preg_replace('/\W(?![^.]*$)/', '_', $fileName) 
2

您可以使用正則表達式前瞻:

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

\W(?=.*\.[^.]+$)將匹配後跟DOT和任何擴展的一個非字字符。

RegEx Demo