如何在php字符串中删除%-sign

时间:2010-07-18 13:43:18

标签: php string sign

我需要从目录中的文件或图像名称中删除%符号 我使用哪个字符串

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

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

但它没有用 回复我使用哪个字符串(trim,str_replace不起作用 preg_replace如何使用remove&%$等  回复

3 个答案:

答案 0 :(得分:4)

这可能是其他事情的问题,因为你的逻辑似乎是正确的。的首先

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

应该是:

rename($oldfile,$newfile);

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

应该是:

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

因为不需要额外的插值。会加快速度。来源:The PHP Benchmark(参见“double(”)与single(')引号“)。here

关于这个问题,你必须做一些正确的调试:

  • echo "[$oldfile][$newfile]";看起来是否符合预期
  • 确保文件夹和旧文件存在。
  • var_dump(file_exists($oldfile),file_exists($newfile))输出true, false
  • file_get_contents($oldfile);是否有效?
  • file_put_contents($newfile, file_get_contents($oldfile));
  • 确保您拥有该文件夹的写入权限。通常chmod 777会这样做。
  • 在重命名之前,执行:if ( file_exists($newfile) ) { unlink($newfile); },因为您将不得不删除新文件(如果存在),因为您将转移到该文件。或者,如果您不想进行替换,可以在文件名中添加一些内容。你明白了。

关于替换问题。

正如您所说,您希望删除%xx值,最好先解码它们:

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

您可以使用正则表达式:

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

或者如果你想更加严格:

$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 -

\\可以逃避正则表达式字符。也许我逃脱的所有角色都不需要它们,但历史证明你比对不起更安全! ;-)

答案 1 :(得分:2)

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

rename($oldfile,$newfile);

答案 2 :(得分:0)

要替换文件名(或任何字符串)中的&%$,我会使用preg_replace。

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

这将输出file-name。请注意,使用此解决方案,许多连续列入黑名单的字符只会产生一个-。这是一个功能; - )