Kom ihåg mig?
Home Menu

Menu


PHP: Filtrera bort icke-ascii och konvertera åäö.

 
Ämnesverktyg Visningsalternativ
Oläst 2009-01-10, 21:25 #1
crazzys avatar
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2007
Inlägg: 1 089
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
crazzys avatar
 
Reg.datum: Aug 2007
Inlägg: 1 089
Jag vill skriva en funktion som filtrerar en sträng och gör den mera "url-vänlig". Den filtrerade strängen ska inte innhålla något annat än: A-Z, a-z, 0-9, och - (bindestreck). Jag vill dessutom konvertera alla åäö till aao. Till den första biten skulle jag nog kunna få ihop ett regexp med några timmars googlande. Men åäö-biten går jag bet på. Jag får det inte att funka med preg_replace och hexkoden \xe5 för å. Och jag kan inte skriva ett å som det är i koden. Binero verkar inte ha utf-8 som standard på sina servrar och jag kan inte göra om filen eftersom iconv inte finns. Jag kan inte ens se vilket character set som körs, för kommandot file finns inte.

Nuvarande funktion ser ut såhär:
Kod:
function urlify($str) {
    $invalid=array(" ","<",">","?","&","#");
    $replace=array("-","","","","","");
    $str=str_replace($invalid,$replace,$str);
    $str=preg_replace("/\xe5/","a",$str);
    return $str;
}
Den koden rår inte på ett å. Jag har inte skrivit någon kod för äöÅÄÖ än eftersom detta sättet inte funkar. Någon som vet hur man gör?
crazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 03:13 #2
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Originally posted by crazzy@Jan 10 2009, 21:25
Jag vill skriva en funktion som filtrerar en sträng och gör den mera "url-vänlig". Den filtrerade strängen ska inte innhålla något annat än: A-Z, a-z, 0-9, och - (bindestreck). Jag vill dessutom konvertera alla åäö till aao. Till den första biten skulle jag nog kunna få ihop ett regexp med några timmars googlande. Men åäö-biten går jag bet på. Jag får det inte att funka med preg_replace och hexkoden \xe5 för å. Och jag kan inte skriva ett å som det är i koden. Binero verkar inte ha utf-8 som standard på sina servrar och jag kan inte göra om filen eftersom iconv inte finns. Jag kan inte ens se vilket character set som körs, för kommandot file finns inte.

Nuvarande funktion ser ut såhär:
Kod:
function urlify($str) {
 * * * *$invalid=array(" ","<",">","?","&","#");
 * * * *$replace=array("-","","","","","");
 * * * *$str=str_replace($invalid,$replace,$str);
 * * * *$str=preg_replace("/\xe5/","a",$str);
 * * * *return $str;
}
Den koden rår inte på ett å. Jag har inte skrivit någon kod för äöÅÄÖ än eftersom detta sättet inte funkar. Någon som vet hur man gör?
Sök efter en funktion som heter UrlEnCode resp UrlDeCode, det finns redan konverteringsrutiner för att omvandla mellanslag till "%20" och alla möjliga andra konstellationer så det passar i en URL.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 13:29 #3
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
vill du ha en fuktion som gör om utf-8 texten "Räksmörgås á la Carte?" till "raksmorgas_a_la_carte_" så får du titta på multibytefunktionerna i php.
steg 1: gör om till gemener mha mb_strtolower()
steg 2: byt ut [åäöàéü(mellanslag)] till sin motsvarighet [aaoaeu_] med preg_replace() som kan hantera matriser med sök/ersätt
steg 3: byt ut allt som inte är [abcdedfghijklmnopqrsuvwxyz0123456789_-] till [_] med preg_replace() .
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 19:19 #4
crazzys avatar
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2007
Inlägg: 1 089
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
crazzys avatar
 
Reg.datum: Aug 2007
Inlägg: 1 089
Tack för svaren, ska testa lite senare ikväll. Får se om man kan hitta någon bra guide till regexpen i php. (Varför kan inte alla implementationer av regexp funka likadant?)
crazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 19:44 #5
Adam Adam är inte uppkopplad
Medlem
 
Reg.datum: May 2003
Inlägg: 193
Adam Adam är inte uppkopplad
Medlem
 
Reg.datum: May 2003
Inlägg: 193
Har skrivit en liknande funktion. Min använder först PHPs strtolower för att få små bokstäver, sedan en str_replace för att byta åäö till aao. Sist kör jag Zend_Filter_Alnum på strängen som filtrerar bort allt förutom a-z och siffror.

Zend ramverket är bra på så sätt att du kan importera just det du behöver.
Adam är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 19:49 #6
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Den här länken går till en regexpsida där man kan testa sina regexsps:
http://www.cuneytyilmaz.com/prog/jrx/
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-11, 23:03 #7
crazzys avatar
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2007
Inlägg: 1 089
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
crazzys avatar
 
Reg.datum: Aug 2007
Inlägg: 1 089
Jag blir galen på de här förbannade regexpen. Hur gör jag för att matcha mot ett hexvärde?
Kod:
function urlify($str) {
    $str=preg_replace('/\xE5/','a',$str); 
    return $str;
}
Eller finns det något annat smart sätt att byta ut åäö mot aao?

Citat:
Originally posted by Magnus_A@Jan 11 2009, 19:49
Den här länken går till en regexpsida där man kan testa sina regexsps:
http://www.cuneytyilmaz.com/prog/jrx/
Fattade inte mycket av den sidan men där måste jag väl ha mitt regexp färdigt?
crazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-12, 08:36 #8
crazzys avatar
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2007
Inlägg: 1 089
crazzy crazzy är inte uppkopplad
Har WN som tidsfördriv
crazzys avatar
 
Reg.datum: Aug 2007
Inlägg: 1 089
Har lyckats med att filtrera åäö nu, helvete vad jobbigt det är att försöka editera tecknen på de raderna när servern inte kör samma charset som laptopen. Aja, lite frågetecken och andra skräptecken i skriptet men det funkar.
Kod:
 * * * *$str=ereg_replace("å",'a',$str);
 * * * *$str=ereg_replace("ä",'a',$str);
 * * * *$str=ereg_replace("ö",'o',$str);
 * * * *$str=ereg_replace("�^�",'A',$str);
 * * * *$str=ereg_replace("�^�",'A',$str);
 * * * *$str=ereg_replace("�^�",'O',$str);
Sedan gör jag om alla spaces till - med den här raden:
Kod:
$str=str_replace(' ','-',$str);
Och efter det så slänger jag alla tecken jag inte vill ha:
Kod:
$str=mb_eregi_replace("[^a-z0-9\-_]","",$str);
Edit: Mina skräptecken blev visst entities på forumet.
crazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-12, 09:32 #9
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Det verkar fungera i alla fall, men ditt problem var att du ville byta ut ett hexvärde som passar en ISO-8859 i en utf-8 sträng, och den finns ju inte där.


jag skulle starkt rekommendera att utgå från utf8 , eventuellt kontrollera ditt indata så att det säkert är i rätt kodning, och sen kan du i lugn och ro byta vilka tecken du vill.
Ett sätt att kontrollera vilken kodning strängen är med mb_detect_encoding()
Typ så här:

Kod:
$string= 'åäö';
$string_iso = *mb_convert_encoding($string,'ISO-8859-1',auto);

echo mb_detect_encoding($string,'UTF8,ISO-8859-1').' '.urlify($string).'<br>';
echo mb_detect_encoding($string_iso,'UTF8,ISO-8859-1').' '.urlify($string_iso).'<br>';
function urlify($str) {
 * * * $str=preg_replace('/\xE5/','a',$str); *
 * * * return $str;
}
Utdata:

Citat:

UTF-8 åäö
ISO-8859-1 a??
Som du ser så fungerar din regexp helt ok så länge du matar den med ISO. Men om du har UTF8 i strängen från början så ska du inte ändra utan utgå från den kodning du har.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-01-12, 11:21 #10
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Utan att ha testat nu så har jag hittat några refernser på problemet med urlencode() resp urldecode():

urlencode(): http://www.phpdig.net/ref/rn64re1351.html
urldecode(): http://www.phpdig.net/ref/rn64re1350.html
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 23:07.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017