2010-07-18 3 views
3

je dois supprimer% signe du nom de fichier ou l'image dans le répertoire qui chaîne i utiliseComment supprimer% --sign dans la chaîne php

$oldfile = "../wallpapers/temp-uploaded/".$file ; 
$newfile = "../wallpapers/temp-uploaded/". trim(str_replace('%', '', $file)); 

rename("$oldfile","$newfile"); 

Mais son moi ne fonctionne pas réponse quelle chaîne i utilise (garniture , str_replace ne fonctionne preg_replace comment puis-je utiliser pour supprimer &% $ etc réponse Retour

Répondre

4

Il pourrait être un problème avec d'autres choses comme la logique semble correcte. d'abord

rename("$oldfile","$newfile"); 

devrait être:

rename($oldfile,$newfile); 

et:

$oldfile = "../wallpapers/temp-uploaded/".$file ; 

devrait être:

$oldfile = '../wallpapers/temp-uploaded/'.$file ; 

car il n'y a pas besoin de l'interpolation supplémentaire. Va accélérer les choses. Source:.. The PHP Benchmark (Voir "double (") par rapport à un seul (') entre guillemets ") Et here

En ce qui concerne le problème, vous devez faire du débogage approprié:

  • Est-ce echo "[$oldfile][$newfile]"; regard comme prévu
  • Assurez-vous que le dossier et existe oldfile.
  • Est-ce que var_dump(file_exists($oldfile),file_exists($newfile)) sortie true, false
  • Est-ce que file_get_contents($oldfile); travail?
  • Est-ce que file_put_contents($newfile, file_get_contents($oldfile));
  • Vérifiez que vous disposez des autorisations d'écriture pour le dossier. Typiquement chmod 777 fera l'affaire.
  • Avant le changement de nom, effectuer: if (file_exists($newfile)) { unlink($newfile); } que vous devrez supprimer le newfile si elle existe, comme vous déplacerez à elle. Alternativement, vous pouvez ajouter quelque chose au nom de fichier si vous ne voulez pas faire de remplacement. Vous avez eu l'idée.

En ce qui concerne la question de remplacement.

Comme vous l'avez dit que vous voulez valeurs% xx supprimé, il est probablement préférable de les décoder d'abord:

$file = trim(urldecode($file)); 

Vous pouvez utiliser une expression régulière alors:

$newfile = '../wallpapers/temp-uploaded/'.preg_replace('/[\\&\\%\\$\\s]+/', '-', $file); // replace &%$ with a - 

ou si vous voulez être plus stricte:

$newfile = '../wallpapers/temp-uploaded/'.preg_replace('/[^a-zA-Z0-9_\\-\\.]+/', '-', $file); // find everything which is not your standard filename character and replace it with a - 

Les \\ sont là pour échapper le caractère regex. Peut-être qu'ils ne sont pas nécessaires pour tous les personnages que je l'ai échappé, mais l'histoire vous a prouvé vaut mieux prévenir que guérir!;-)

+0

J'ai besoin de cela si% $ # etc dans le nom de l'image puis le remplacer par -ou _ comment faire? – Hassan

+0

@balupton: Pourquoi les guillemets doubles devraient-ils être convertis en guillemets simples? Les doubles guillemets sont tout aussi corrects. – Znarkus

+0

@ user395167 - J'ai mis à jour le post pour inclure des expressions régulières, c'est le meilleur moyen. Vous avez le choix de ce que vous recherchez, et une variation plus stricte. @Znarkus. J'ai mis à jour le post pour inclure la raison et une source de référence. – balupton

2
$file = trim($file); 
$oldfile = "../wallpapers/temp-uploaded/".$file ; 
$newfile = "../wallpapers/temp-uploaded/".str_replace('%', '', $file); 

rename($oldfile,$newfile); 
0

Pour remplacer &%$ dans le nom de fichier (ou une chaîne), j'utiliser preg_replace.

$file = 'file%&&$$$name'; 
echo preg_replace('/[&%$]+/', '-', $file); 

Affichera file-name. Notez qu'avec cette solution, de nombreux caractères noirs consécutifs donneront un seul -. Ceci est une fonctionnalité ;-)