B Bäckman Medlem sedan nov. 2001 274 inlägg Frågan 16 aug. 2003 12:25 #1 Hejsan.
Jag håller på med en uploadfunktion. När en användare laddar upp en fil så ska den döpas om, och i filnamnet så ska användarnamnet på den som laddar upp filen ingå.
Mitt problem är att om man försöker ladda upp en fil med användarnamnet "Åke Vader" t.ex. så går filen inte att ladda ned sen p.g.a. Å:et. :)
Jag skulle vilja byta ut alla förbjudna bokstäver på ett snabbt och smidigt sätt. Ni får också gärna upplysa mig om vilka tecken som är tillåtna att ha i filnamn, och vilka som inte är det.
P pimme Medlem sedan sep. 2001 1 086 inlägg $newName = preg_replace('/[^a-z0-9_-\.]/i', '', $name);
tar bort alla tecken som inte är a-z, 0-9, -, _ och .
De teknena borde vara tillåtna iaf.
Vilka som är tillåtna beror nog på vilket OS servern kör.
Tänk på att kolla så att du inte får ett tomt filnamn...
B Bäckman Medlem sedan nov. 2001 274 inlägg Verkar kunna bli lite klurigt det där. Kanske bättre att köra den kollen på användarnamnen istället, så att man inte kan registrera ett konstigt namn.
Tack för kodsnutten iaf, den kommer till användning.
spango Medlem sedan juni 2000 8 205 inlägg Re: Byta ut otillåtna filtecken?
Bäckman skrev:
Mitt problem är att om man försöker ladda upp en fil med användarnamnet "Åke Vader" t.ex. så går filen inte att ladda ned sen p.g.a. Å:et. :)
Jodå, det går visst, bara man URL-kodar Å:et i länken.
W woppe Medlem sedan mars 2003 34 inlägg eller så kan du använda urlencode() det gör jag.
ex:
$foo = Ä Ä;
echo urlencode($foo);
blir typ %AE%20%AE
Har den här funktionen för att skapa "snygga" filnamn:
function fixname($fname = ""){
$match = array('Å', 'Ä', 'Ö', 'å', 'ä', 'ö', ' ');
$replace = array('a', 'a', 'o', 'a', 'a', 'o', '_');
$fname = strtolower($fname);
$fname = str_replace($match, $replace, $fname);
return preg_replace('/[^a-z0-9\._\-]/i', '', $fname);
}
Men åäö ÅÄÖ tas bort helt och ersätts in av aao AAO. Kommenterar jag bort preg_replace() så står det ändå åäö ÅÄÖ i namnet.
Vad är fel? Kan det ha med teckenkodning att göra?
P Pedda Medlem sedan juni 2000 6 031 inlägg Detta bör fungera
function fixname($fname){
$match = array('Å', 'Ä', 'Ö', 'å', 'ä', 'ö', ' ');
$replace = array('a', 'a', 'o', 'a', 'a', 'o', '_');
return str_replace($match, $replace, $fname);
}
echo fixname('Åke Östangård');
/red
Osäker på andra system, men i Windows är följande tecken ogiltiga i filnamn.
< > : " / \ | ? *
Pedda skrev:
Detta bör fungera
function fixname($fname){
$match = array('Å', 'Ä', 'Ö', 'å', 'ä', 'ö', ' ');
$replace = array('a', 'a', 'o', 'a', 'a', 'o', '_');
return str_replace($match, $replace, $fname);
}
echo fixname('Åke Östangård');
/red
Osäker på andra system, men i Windows är följande tecken ogiltiga i filnamn.
< > : " / \ | ? *
Nej, blir exakt samma sak. Men det kvittar egentligen, eftersom jag måste ha min preg_replace för att andra specialtecken osv. ska tas bort.
Sitter just nu och testar på Apache på Windows, spelar det någon roll?
P Pedda Medlem sedan juni 2000 6 031 inlägg Testade också nu på Apache och Windows.
Funkar fint för mig.
Testa gärna det här på din server där det funkar:
function fixname($fname = ""){
$match = array("Å", "Ä", "Ö", "å", "ä", "ö", " ", " ");
$replace = array("a", "a", "o", "a", "a", "o", "_", "__");
$fname = strtolower($fname);
$fname = str_replace($match, $replace, $fname);
// $fname = preg_replace('/[^a-z0-9\._\-]/i', '', $fname);
return $fname;
}
if($handle = opendir("./galleri")) {
$files = array();
$notlisted = array(".", "..");
while (false !== ($file = readdir($handle))) {
$path_parts = pathinfo($file);
if(!in_array($file, $notlisted)){
echo fixname($file) . "<br />";
}
}
}
Har det med att göra att jag listar filer? Det jag ska göra är att "indexera" bilder i en mapp och döpa om alla m.h.a rename() men först måste jag få det här att fungera.
Ska testa senare hur det blir om jag kör det under FreeBSD.
P Pedda Medlem sedan juni 2000 6 031 inlägg Funkade inte för mig heller när man loopade filer.
Löste det med htmlentities().
<?php
function fixname($fname){
$match = array('å', 'ä', 'ö', ' ');
$replace = array('a', 'a', 'o', '_');
return str_replace($match, $replace, strtolower($fname));
}
if($handle = opendir("./galleri")) {
$files = array();
$notlisted = array(".", "..");
while (false !== ($file = readdir($handle))) {
$path_parts = pathinfo($file);
if(!in_array($file, $notlisted)){
echo fixname(htmlentities($file)) . "<br />";
}
}
}
?>
Aha! Då kanske det beror på att koden är UTF-8 och att filsystemet kör nån annan kodning? Ska prova, tack!
P Pedda Medlem sedan juni 2000 6 031 inlägg Om det fungerar för dig så kan du markera rätt svar med "Markera som lösning" så är det lättare för andra med samma problem att hitta lösningen.
Pedda skrev:
Om det fungerar för dig så kan du markera rätt svar med "Markera som lösning" så är det lättare för andra med samma problem att hitta lösningen.
Hade jag självklart gjort, om det var jag som startat tråden från början :)
Sökte innan och "kapade" den här istället för att skapa en egen.
P Pedda Medlem sedan juni 2000 6 031 inlägg Missade det. (y)
Hoppas att det fungerar för dig iaf. :)
Illius Medlem sedan aug. 2009 29 inlägg Är det inte bättre att sätta ut ID:n på användaren ist för användarnamnet...? tänker mig att det kanske kan bli stora fel i längden annars.
Illius skrev:
Är det inte bättre att sätta ut ID:n på användaren ist för användarnamnet...? tänker mig att det kanske kan bli stora fel i längden annars.
Va?
/r Jaha, du menar ursprungsinlägget, trodde du syftade på något jag skrev tidigare.