WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   PHP: Filtrera bort icke-ascii och konvertera åäö. (https://www.wn.se/forum/showthread.php?t=34373)

crazzy 2009-01-10 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?

Conny Westh 2009-01-11 03:13

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.

Magnus_A 2009-01-11 13:29

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() .

crazzy 2009-01-11 19:19

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?)

Adam 2009-01-11 19:44

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.

Magnus_A 2009-01-11 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/

crazzy 2009-01-11 23:03

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 2009-01-12 08:36

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. :)

Magnus_A 2009-01-12 09:32

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.

Conny Westh 2009-01-12 11:21

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


Alla tider är GMT +2. Klockan är nu 13:57.

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