2016-12-23 97 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