Avatar billede eksperten1 Nybegynder
28. juni 2008 - 01:41 Der er 15 kommentarer

Regex - Hvordan "renser" jeg et filnavn

Jeg vil gerne bruge regexp (eller bedre alternativ?) til at "rense" et filnavn på filer som brugere uploader.

Det er sådan at de filer som brugeren uploader nogle gange indeholder sjove tegn, æ ø å etc - disse vil jeg gerne rense ud sådan at jeg ender ud med et filnavn som der kan bruges i en url

eks :
bruger uploader "års rapport idényt 2008"
jeg vil gerne gemme filen som "ars_rapport_idenyt_2008"

Jeg regner med at I kan se princippet :-D

Jeg har ledt efter det - er temmelig ny i php og især regexp

Takker og bukker (og går snart i seng)
Avatar billede stuffedk Nybegynder
28. juni 2008 - 03:11 #1
du bruge preg_replace() til hvert enkelt tegn:

$filnavn = "æ ø å";
$filnavn = preg_replace("/æ/","ae",$filnavn);
$filnavn = preg_replace("/ø/","oe",$filnavn);
$filnavn = preg_replace("/å/","aa",$filnavn);
$filnavn = preg_replace("/ /","_",$filnavn);
echo $filnavn;

men jeg ville nu nok bare bruge urlencode() som "encoder" en url, så det er ligegyldigt hvilke tegn der er i den:

$filnavn = "æ ø å";
$encoded_filnavn = urlencode($filnavn);
echo $encoded_filnavn;
Avatar billede nielle Nybegynder
28. juni 2008 - 08:22 #2
Heller bruge str_replace() hvis det ikke er mere avanceret end det. Men ellers er jeg helt enig.
Avatar billede eksperten1 Nybegynder
28. juni 2008 - 09:57 #3
Det er bl.a. fordi jeg skal gemme filen på disken med det navn - jeg tænker at det bliver enormt omstændigt at lave xx str_replace/preg_replace for alle forekomster - jeg havde tænkt at det skulle være "omvendt" altså en række "lovlige tegn" samt en nøgle til oversættelse.

Det kan godt være jeg skal ud i noget funktion og explode som så kontrollerer alle tegn i navnet for om tegnet skal oversættes - eller fjernes.

Nå men tak indtil videre - hvis nu der er en der ligger inde med en funktion til dette :-D Så vil jeg da gerne se på den som inspiration.!!

God weekend
Avatar billede Slater Ekspert
28. juni 2008 - 12:20 #4
nielle: faktisk hellere bruge strtr() hvis det ikke er mere avanceret end det :)
Den er langt hurtigere end str_replace().
Avatar billede olebole Juniormester
28. juni 2008 - 15:25 #5
<ole>

Man gemmer ikke filer, der skal ende på nettet med filnavne, som vides at give problemer på nettet  ;o)

Vi har før set eksempler på, at det end ikke var muligt at tilgå filerne for omdøbning på serveren. Giv dine filer fornuftige (og på WWW er det internationale) navne - så får du ikke problemer  =)

/mvh
</bole>
Avatar billede Slater Ekspert
28. juni 2008 - 22:26 #6
Det er jo netop det han vil, ole? Han spørger jo netop hvordan han fjerner de tegn der kan give problemer.
Avatar billede olebole Juniormester
28. juni 2008 - 23:08 #7
Ja, viperine - og spørger han om, hvordan han kan flyve ned fra Rundetårn ved at baske med armene, får han også at vide, han bør undlade  ;o)

Problemet er ikke at få tegnene fjernet, men at de i første omgang er blevet skrevet. Det skylder man at fortælle ham ... ellers lærer han jo aldrig, hvordan man laver filer til brug på WWW  =)
Avatar billede jakobdo Ekspert
28. juni 2008 - 23:21 #8
Jeg har tidligere brugt denne funktion med success...

rewrite_url($input){
    $output = strtr($input,
        "\xe1\xc1\xe0\xc0\xe2\xc2\xe4\xc4\xe3\xc3\xe5\xc5".
        "\xaa\xe7\xc7\xe9\xc9\xe8\xc8\xea\xca\xeb\xcb\xed".
        "\xcd\xec\xcc\xee\xce\xef\xcf\xf1\xd1\xf3\xd3\xf2".
        "\xd2\xf4\xd4\xf6\xd6\xf5\xd5\x8\xd8\xba\xf0\xfa\xda".
        "\xf9\xd9\xfb\xdb\xfc\xdc\xfd\xdd\xff\xe6\xc6\xdf\xf8",
        "aAaAaAaAaAaAacCeEeEeEeEiIiIiIiInNo".
        "OoOoOoOoOoOoouUuUuUuUyYyaAso");
    $output    = strtolower($output);
    $output    = htmlentities($output);
    $output    = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml);/", "$1", $output);
    $output    = preg_replace("/([^a-z0-9]+)/", "_", html_entity_decode($output));
    $output    = trim($output, "_");
    return $output;
}
Avatar billede Slater Ekspert
28. juni 2008 - 23:59 #9
ole - Ja, men han siger "eks: bruger uploader 'års rapport idényt 2008'" - altså et system hvor brugerne kan uploade filer. Og det kan han jo ikke lære at få dem til at lade være med.
Avatar billede olebole Juniormester
29. juni 2008 - 00:05 #10
- aha
Avatar billede olebole Juniormester
29. juni 2008 - 00:14 #11
Noget i stil med:

<script type="test/JavaScript">
function valider(oForm) {
    var aFileName = oForm.myFile.value.split("\\");
    var sFileName = aFileName.pop();
    if (!(/^[a-z0-9_-]*$/i).test(sFileName )) {
        alert("Filnavnet må kun indeholde bogstaver mellem a og z, samt tal, bindestreg og underscore.\n\nOmdøb venligst filen.");
        return false;
    }
    return true;
}
</script>
Avatar billede olebole Juniormester
29. juni 2008 - 00:20 #12
På et eller andet tidspunkt må den enkelte borger i Informationssamfundet vel lære, hvad WWW er - og hvordan det bruges. WWW er allerede voldsomt udbredt og meget mere vil i fremtiden blive webbaseret - samtidig med at udviklingen går mod mere og mere brugerleveret indhold - så det er ikke spor for tidligt.
Spørgsmålet er så, om man som koder ser det som sin opgave at 'opdrage' brugeren  =)
Avatar billede eksperten1 Nybegynder
29. juni 2008 - 08:27 #13
Hold da op med indlæg!
OleBole, du har jo self. ret i, at i den ideelle verden ville alle mennesker vide hvilke tegn der er tilladt - men især her i Danmark har mange mennesker en uvane med at bruge specielt 3 tegn som ødelægger det for resten af verden ;-D

Det vil være usandsynligt at "opdrage" brugerne - og set fra et usability synspunkt mener jeg heller ikke at det er det rigtige at gøre - altså at fortælle brugeren at der er "ulovlige" tegn i deres filnavn - i min verdensopfattelse er det vores programmer der skal tilpasse sig brugerne og ikke omvendt - my $0.02

Nå men jakobdo - jeg tester din funktion senere idag - den ser spændende ud !
Avatar billede olebole Juniormester
29. juni 2008 - 23:52 #14
Man bør lære sine børn at stave - ikke rette deres breve i evigheder. Dét er usability.

Derudover skal man nok passe på med at undervurdere brugerne. Husk på, dine brugere f.eks. har lært at oprette en abstrakt forbindelse mellem en lille, buttet klump plastik i højre hånd og en pil på skærmen. Det er en dramatisk større intellektuel udfordring end at undgå tre bestemte bogstaver  ;o)

- men verden ser jo forskellig ud fra forskellige steder  =)
Avatar billede Slater Ekspert
30. juni 2008 - 18:40 #15
Jeg er klart enig med eksperten1 her - det er ikke vores job som webdesignere, at bestemme hvordan brugerne skal bruge vores side. Tværtimod skal vi, så vidt muligt, give dem alle muligheder for at gøre det på deres måde, og så let som muligt.
Begynder vi at opdrage på dem, undervurderer vi dem netop, og er nedladende overfor dem samtidig.

En upload-form, der fortæller folk hvordan de skal navngive deres filer, svarer til de internetsider, hvor der står "lavet med/ses bedst med browser x". Det er ikke vores job at fortælle brugerne vores præferencer, men at lave vores løsninger kompatible med alle.
Dét er usability.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester