Hallo,
$filename = preg_replace('[:punct:]', "", $filename);
$filename = preg_replace('[:blank:]',"_",$filename);
$filename = preg_replace('[:space:]', "_",$filename);
Die POSIX-Zeichenklassen funktionieren bei den PERL-kompatiblen regulären Ausdrücken nicht.
Siehe: http://de3.php.net/manual/de/reference.pcre.pattern.syntax.php
Alle Leerzeichen bekommst Du bspw. mit \s (statt [:space:]).
Viele Grüße,
Christian