Kom ihåg mig?
Home Menu

Menu


Skapa URL-friendly länkar

 
Ämnesverktyg Visningsalternativ
Oläst 2008-01-02, 16:53 #1
mindphaser mindphaser är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2006
Inlägg: 423
mindphaser mindphaser är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2006
Inlägg: 423
Hej,

behöver lite hjälp med att skapa en URL-vänlig sträng, dvs skala bort alla tänkbara specialtecken. Själv trodde jag det skulle gå bra med tex str_replace enligt nedan, men tex tecknen ' : á osv fungerar ej att ersätta. Ny inom PHP så jag har väl missat ngt. Se exempelkod nedan:

Kod:
function urlizeString($aString)
{
	$newTitle = str_replace("(", "", $aString);
	$newTitle = str_replace(")", "", $newTitle);
	$newTitle = str_replace("á", "a", $newTitle);
	$newTitle = str_replace("à", "a", $newTitle);
	$newTitle = str_replace("\'", "", $newTitle);
	$newTitle = str_replace(":", "", $newTitle);
	$newTitle = str_replace("/", "", $newTitle);
	$newTitle = str_replace("?", "", $newTitle);
	$newTitle = str_replace("\"", "", $newTitle);
	$newTitle = str_replace("ö", "oe", $newTitle);	# ö
	$newTitle = str_replace("Ã¥", "au", $newTitle); # å
	$newTitle = str_replace("ä", "ae", $newTitle); # ä 
	$newTitle = str_replace("Ã…", "Au", $newTitle); # Å 
	$newTitle = str_replace("’", "", $newTitle);
	$newTitle = str_replace(",", "", $newTitle);
	$newTitle = str_replace(" ", "_", $newTitle);	
	
	#$newTitle = ereg_replace("[^+A-Za-z0-9]", "", $newTitle =);
	
	return $newTitle;
}
mindphaser är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-02, 17:01 #2
gsocs avatar
gsoc gsoc är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2007
Inlägg: 568
gsoc gsoc är inte uppkopplad
Mycket flitig postare
gsocs avatar
 
Reg.datum: Jun 2007
Inlägg: 568
Kod:
function urlizeString($aString)
{
$aString=strtolower($aString);
$newTitle = str_replace(array(' ','--','"','!','@','#','$','%','^','&','*','(',')','_','+','{','}','|',':','"','<','>','?','[',']','\\',';',"'",',','.','/','*','+','~','`','='), array('-','-','','','','','','','','','','','','','','','','','','','','','','','','');, $aString);
return $newTitle; 
}
Edit: Oj jag missuppfattade frågan...

Pröva lägg en \ framför '
gsoc är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-02, 17:11 #3
mindphaser mindphaser är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2006
Inlägg: 423
mindphaser mindphaser är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2006
Inlägg: 423
Nope, det funkar inte heller för mig. Om jag tittar på hur tex phpbb gör så liknar det min lösning och det funkar inte om jag kopierar in och använder deras heller.

Att ersätta åäö samt mellanslagen funkar dock. Nån ide? Har jag missat någon setting, typ charset eller liknande?

Kod:
function make_url_friendly($url)
{
  $url = trim($url);
  $url = strtolower($url);
  // Fix for most recent topics block
  // or else a b is shown in every url
  $find = array('<b>',
   '</b>');
  $url = str_replace ($find, '', $url);
  $url = preg_replace('/<(\/{0,1})img(.*?)(\/{0,1})\>/', 'image', $url);
  $find = array(' ',
   '"',
   'quot',
   '&',
   'amp;',
   '\r\n',
   '\n',
   '/',
   '\',
   '+',
   '<',
   '>');
  $url = str_replace ($find, '-', $url);
  $find = array('é',
   'è',
   'ë',
   'ê',
   'É',
   'È',
   'Ë',
   'Ê');
  $url = str_replace ($find, 'e', $url);
  $find = array('í',
   'ì',
   'î',
   'ï',
   'Í',
   'Ì',
   'Î',
   'Ï');
  $url = str_replace ($find, 'i', $url);
  $find = array('ó',
   'ò',
   'ô',
   'Ó',
   'Ò',
   'Ô');
  $url = str_replace ($find, 'o', $url);
  $find = array('ö',
    'Ö');
  $url = str_replace ($find, 'o', $url);
  $find = array('á',
   'à',
   'â',
   'Á',
   'À',
   'å',
   'Å',
   'Â');
  $url = str_replace ($find, 'a', $url);
  $find = array('ä',
    'Ä');
  $url = str_replace ($find, 'a', $url);
  $find = array('ú',
   'ù',
   'û',
   'Ú',
   'Ù',
   'Û');
  $url = str_replace ($find, 'u', $url);
  $find = array('ü',
    'Ü');
  $url = str_replace ($find, 'ue', $url);
  $find = array('ß');
  $url = str_replace ($find, 'ss', $url);
  $find = array('ç');
  $url = str_replace ($find, 'c', $url);
  $find = array('/[^a-z0-9\-<>]/',
   '/[\-]+/',
   '/<[^>]*>/');
  $repl = array('',
   '-',
   '');
  $url = preg_replace ($find, $repl, $url);
  $url = str_replace ('--', '-', $url);
  return $url;
}
mindphaser är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-02, 18:29 #4
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
1. Använd mb_string om du har utf-8 som teckenuppsättning.
2. Det verkar som du använder dig av en onödigt omständig metod - vad behöver du strängen till? För de flesta saker som behövs så finns det färdiga php-funktioner (exempelvis urlencode() för att använda strängar i länkar och htmlentities() för att ta bort otillåtna tecken i xml), annars brukar det gå att lösa med ett regexp-uttryck.
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-02, 19:36 #5
mindphaser mindphaser är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2006
Inlägg: 423
mindphaser mindphaser är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2006
Inlägg: 423
matine: Jag tänkte använda strängen till att skapa URLer att använda vid en URL rewrite implementering. Ska ta topic för ett inlägg/ämne som namn på URL och sedan lägga på ID för inlägg för att skapa hela URLen. Det funkar nu, men ser snyggare ut om specialtecknen ersätts att tecken som inte omvandlas till %-tecken i URLen. Typ: Ch%C3%A1vez%E2%80%99s ska vara Chávez's
mindphaser är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-02, 20:06 #6
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Ja, om du helt vill ersätta bokstäver med prickar med motsvarande bokstav utan prickar så finns det nog ingen funktion för just detta i php… Du får nog använda mb_string-funktionerna t.ex. mb_strtolower eller preg_replace, de vanliga strängfunktionerna mäktar inte utf-8.

Tänk på att det finns många tusen tecken i utf-8 så att träffa alla är nog inte så lätt, en bra början är att utesluta och inte godkänna vissa tecken redan vid inmatningen.

Med preg_replace kan du ju göra t.ex.
$new_string = preg_replace('/[äåá]/ui',"a",$string);
men det blir ju ganska omfattande och krävande…

Om du studerar unicode-tabellerna så kan du leta upp "ranges" som minskar ner jobbet lite, t.ex. 0x0100 till 0x0105 är olika former av bokstaven a.
http://unicode.org/charts/PDF/U0100.pdf

Enklast är kanske att låta php med mb_string konvertera från uft-8 till iso-8859-1 så att de flest "osvenska" tecknen försvinner och sedan bara ha runt 250 tecken att behöva behandla…
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-03, 23:52 #7
eliasson eliasson är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Dec 2005
Inlägg: 1 863
eliasson eliasson är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Dec 2005
Inlägg: 1 863
Om jag inte minns helt fel så kan du, i PHP, använda en funktion där du specificierar endast vilka tecken som får finnas i en sträng och så plockar den bort alla som inte är tillåtna -- någon som kan sparka honom i rätt riktning till denna funktion?
eliasson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-04, 01:41 #8
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Citat:
Originally posted by eliasson@Jan 4 2008, 00:52
Om jag inte minns helt fel så kan du, i PHP, använda en funktion där du specificierar endast vilka tecken som får finnas i en sträng och så plockar den bort alla som inte är tillåtna -- någon som kan sparka honom i rätt riktning till denna funktion?
Tja, man kan ju använda preg_replace('/[- \pL]/u',"",$sträng); för att avlägsna allt utom mellanslag, bindestreck och bokstäver i det latinska alfabetet. Men det räcker ju bara en liten bit. Sedan ska ju alla former av a med prickar och sådant ersättas med ett "avskalat" a - och detta gäller för alla bokstäver som kan ha tecken, prickar, ringar, hakar, tak, etc. Inte helt enkelt alltså men man kan ju göra som jag antytt innan:

$str = preg_replace('/[- \pL]/u',"",$str); //tar bort allt utom mellanslag, bindestreck och latinska bokstäver
$str = preg_replace(array('/[åäá?à]/ui','/ö?óò/ui','/é???è/ui'),array("a","o","e"),$str); //byter ut alla oönskade tecken

Särskilt effektivt blir det inte men om det bara behöver göras en gång när artikeln sparas så är det inget problem.

Edit: tydligen klarar inte heller forumet av att visa vissa tecken - frågetecknen ska naturligtvis vara a, o och e med olika hakar och streck.
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-04, 15:57 #9
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Var lite trött igår. Det första regexp:et gör det omvända mot vad man önskar…

[- \pL] ska naturligtvis vara [^- \pL]

mindphaser: meddela om det inte fungerar, jag kanske missat ytterligare något vid den snabba sammanställningen…
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-04, 17:08 #10
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Tycker inte du bör ersätta alla möjliga tecken i utf-8, det blir lite väl tungt och förmodligen onödigt eftersom jag inte kan tänka mig att majoriteten av dessa kan dyka upp i dina länkar. Lista ut vilka som kan tänkas dyka upp och lägg sedan till när det dyker upp nya. Urlencode fungerar ju annars bra även om det inte alltid ser snyggt ut...

Forumet kör inte utf-8...
__________________
Full-stack developer, free for smaller assignments
tartareandesire ä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 19:28.

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