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

crazzy 2009-01-12 13:02

Jag har utf8 överallt, i databasen, i min output till browsern... Har även i min init.php stoppat in en SET NAMES UTF8 till databasen.

Magnus_A 2009-01-12 16:16

Citat:

Originally posted by crazzy@Jan 12 2009, 14:02
Jag har utf8 överallt, i databasen, i min output till browsern... Har även i min init.php stoppat in en SET NAMES UTF8 till databasen.

Då är det definitivt läge för att du gör all scripteditering i utf-8 också. Nu är jag ingen expert på editorer för windows miljö, men det lär finnas en som heter Notepad2 och en annan som heter Textpad som lär stöda unicode.
Om du jobbar med utf8 kan du glömma hexkoderna till åäö.

crazzy 2009-01-12 16:25

Jag kan inte göra editeringen i utf8. Jag kör Linux på min laptop och har utf8 på den. Sedan sitter jag över ssh mot binero och editerar filerna. Binero kör inte utf8 av någon udda anledning. Man kanske borde maila och be om att få file och iconv till sitt konto?

Magnus_A 2009-01-12 18:05

Det är du som gör filerna som bestämmer kodningen. Inte webbhotellet.
Så här ställer du in default charset i apache via .htaccess
http://www.w3.org/International/questions/...taccess-charset

Lägg också till information om kodning i metataggen.
Sen är det bara att köra.

crazzy 2009-01-12 18:38

Och hur bestämmer jag encoding i nano? Går inte den efter vad servern har som default?

Och jag behöver inte sätta någon encoding i .htaccess eftersom jag skickar en Content-Type header vid varje request. Jag kör ju application/xhtml+xml som mime-typ.

Jonas 2009-01-12 18:39

Citat:

Originally posted by crazzy@Jan 12 2009, 17:25
Jag kan inte göra editeringen i utf8. Jag kör Linux på min laptop och har utf8 på den. Sedan sitter jag över ssh mot binero och editerar filerna. Binero kör inte utf8 av någon udda anledning. Man kanske borde maila och be om att få file och iconv till sitt konto?

Kate kan spara och editera i UTF8, om du kör KDE.

crazzy 2009-01-12 18:44

Citat:

Ursprungligen postat av Jonas
Citat:

Ursprungligen postat av crazzy
Jag kan inte göra editeringen i utf8. Jag kör Linux på min laptop och har utf8 på den. Sedan sitter jag över ssh mot binero och editerar filerna. Binero kör inte utf8 av någon udda anledning. Man kanske borde maila och be om att få file och iconv till sitt konto?

Kate kan spara och editera i UTF8, om du kör KDE.

Nej, gnome följde med mint och jag är alldeles för lat för att palla skriva 'apt-get install kde'. :)

Magnus_A 2009-01-12 21:45

Ja, har man inte problem med kodningen så skaffar man sig.
har du aldrig tänkt på att sluta gnälla på Binero och skaffa dig en riktig uppsättning verktyg som fungerar för det du ska göra?

crazzy 2009-01-12 22:05

Citat:

Originally posted by Magnus_A@Jan 12 2009, 21:45
Ja, har man inte problem med kodningen så skaffar man sig.
har du aldrig tänkt på att sluta gnälla på Binero och skaffa dig en riktig uppsättning verktyg som fungerar för det du ska göra?

Jo, när jag har en ordentlig inkomst, eller en lägenhet+fiber så jag kan hosta min egen server. Jag trivs i nano.

martine 2009-01-13 06:42

Citat:

Originally posted by crazzy@Jan 12 2009, 19:38
Och hur bestämmer jag encoding i nano? Går inte den efter vad servern har som default?
Internet säger:
Citat:

In version 1.3.12 or later, Unicode should be usable. With your terminal, locale (LC_ALL and similar environment variables), and encoding configured to properly support UTF-8, you should be able to enter and save Unicode text.
För övrigt så borde det väl gå att ställa om "lokalen" till utf-8? Vet inte mycket om varken binero eller vim/pico-editerande (har blivit för lat och håller mig till grafika program…) men det borde väl vara möjligt? Vad säger "locale -a"? (Eller skicka en supportfråga till Binero ;) - jag tycker nog att det är på tiden att alla nu ställer om till utf-8!)

crazzy 2009-01-13 08:08

Kod:

bash-3.2$ locale -a
bash: locale: command not found
bash-3.2$ env | grep LC
bash: env: command not found
bash-3.2$ echo $LC_ALL

bash-3.2$


martine 2009-01-13 08:39

Citat:

Originally posted by crazzy@Jan 13 2009, 09:08
Kod:

bash-3.2$ locale -a
bash: locale: command not found
bash-3.2$ env | grep LC
bash: env: command not found
bash-3.2$ echo $LC_ALL

bash-3.2$


Där skulle jag nog prata lite med Binero - det måste ju vara möjligt att köra med utf-8! Skilda LC ska ju alla användare kunna köra oavsett default-värdet (eftersom det inte ligger i kärnan, såvitt jag förstått, men jag har egentligen hemskt dålig koll på Linux/Unix).

Dom måste ju själva ha blockerat möjligheten att byta lokal - men i så fall är det väl inte mer än rimligt att man kör utf-8 för alla då! (iso-8859-1 är ju trots allt bara ett subset av utf-8 så ingen blir lidande) Är dom rädda för teckenkodningar där på Binero måntro (det finns ju en liten ettrig grupp "behålla-iso"-anhängare, som inte riktigt förstår teckenkodning och alltså heller inte vågar byta… ;-)

Magnus_A 2009-01-13 10:08

Finns väl inget som tvingar dig att ligga och editera filerna på plats i terminalen?
Editera och spara lokalt och över för den färdiga filen sen. Det kostar inget och det blir rätt.
Lägger du upp en lokal server på din laptop så kan du i lugn och ro testa dina ändringar där istället för att editera live.
Du vill ju jobba seriöst med webbutveckling, börja med att bygga upp en arbetsmetodik som fungerar med versionshantering, testkörning lokalt i skyddad miljö, och ha koll på grejerna. Då jobbar du effektivare, mer kvalitetssäkrat och bättre.
Och det kostar ingenting heller.
Sätt fokus på rätt saker, nu gör du bara ett förvirrat intryck.

crazzy 2009-01-13 10:33

Jag har en server på min laptop, men jag kan inte stoppa så mycket där just nu. Har ett annat projekt på laptopen, som använder mod_rewrite och snor alla urler. Så fort jag har nånstans att bo ska jag ordna en testserver.

martine 2009-01-13 13:32

Citat:

Originally posted by Magnus_A@Jan 13 2009, 11:08
Finns väl inget som tvingar dig att ligga och editera filerna på plats i terminalen?
Editera och spara lokalt och över för den färdiga filen sen. Det kostar inget och det blir rätt.

Du har givetvis rättt. Ingen seriös webbdesigner tillverkar sina webbsidor i vim nuförtiden.

Men har man (och betalar för) SSH-tillgång så ska man väl kunna kräva att det fungerar? Syften kan ju mycket väl vara att gå in och göra små ändringar med unix kraftfulla om än obskyra verktyg (texteditorerna, perl, osv.). För många (mindre vanliga) uppgifter är unix:s sätt att pipe:a, spara, skapa och regexp-bearbeta eller söka filer närmast oslagbart. Det är ju olyckligt om man inte kan få fungerande stöd för något som är så viktigt nu för tiden som utf-8.

(Webbhotell är ju till för personer som inte har licenser på hela Adobe-serien eller kör VS i senaste versionen och bara slänger in en rackserver till om det skulle behövas… ;) - man ska väl för den delen ändå kunna kräva att det fungerar?)

Magnus_A 2009-01-13 17:42

Går du in med ssh och ska ha utf8 att fungera skriver man såhär:
LANG=utf8 ssh user@server
Orsaken är bagg i ssh, eller enklare utryckt, amerikanerna som kör ssh sk-ter i folk som använder konstiga bokstäver.
Om man ska ställa in locale på BSD-servrar, som jag tror Binero kör på, så gäller setenv istället för locale.
Men skaffa dig en riktig uppsättning verktyg så slipper du krångla.
Hört talas om virtual hosts på apache? Går utmärkt att köra lokalt , lägg in din fake-domän i /etc/hosts bara.

crazzy 2009-01-13 20:19

Kod:

LANG=utf8 ssh user@server
Funkade inte. Och binero har migrerat till Linux nu pga vmware. Efter lite snokande tror jag de kör redhat.

Jag ska skaffa riktiga grejer. Har äntligen fixat en lägenhet. Får den 1feb, sen en 100/100 lina så hostar jag allt som inte är under typ 10mb hemma. Då kan jag få det som jag vill. :)

Ska kika på att köra en fakedomän. Har faktiskt inte tänkt på att man kan göra det....

qson 2009-01-15 15:49

Jag hittade en funktion som jag gillade riktigt bra.. Moddade den lite så den blev ännu bättre...
Kod:

        function makeSafe( $s, $charset='UTF-8' ) {
 
  $pattern = '/&([A-Za-z]e?)(uml|acute|circ|tilde|ring|lig|grave|slash|horn|cedil|th);/';
  $replace = "\\1";
 
  $s = htmlentities( $s, ENT_QUOTES, $charset );
  $s = preg_replace($pattern, $replace, $s);
     
  return $s;
        }

Den gör om "konstiga" bokstäver till motsv. html-kodning och sedan plockar ut första bokstaven &Auml; = A, &Ouml; = O osv...
Sen kan man ju komplettera den med extra funk, t.ex. bara små bokstäver, ta bort specialtecken osv. Nu är ju alla viktiga bokstäver i godkända (A-Za-z)...

Have fun folks !

crazzy 2009-01-15 22:21

För den händelse någon är intresserad så ser min färdiga funktion ut såhär:
Kod:

function urlify($str) {
    $str=ereg_replace("é",'e',$str);
    $str=ereg_replace("�^�",'E',$str);
    $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);
    $str=str_replace(' ','-',$str);
    $str=mb_eregi_replace("[^a-z0-9\-_]","",$str);
    return $str;
}

Det som ser ut som entities är ju egentligen bokstäver men ni kan nog lista ut vilka. :)


Alla tider är GMT +2. Klockan är nu 20:29.

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