mboost-dp1
PHP: Problemer med str_replace
- Forside
- ⟨
- Forum
- ⟨
- Programmering
Jeg bruger str_replace til at fjerne uønskede tegn fra mine links så de bliver flottere (ligesom her på newz.dk):
Der er dog nogle links hvor -- alligevel indgår:
http://index.wep.dk/godtur-dk--rejseside-46/
Hvorfor bliver de ikke snuppet og lavet om til en enkelt streg?
Siden som "producerer" de flotte links:
http://index.wep.dk/kategorier
// Mellemrum
$link = str_replace(" ", "-", $titel);
// Special characters
$link = str_replace(",", "-", $link);
$link = str_replace("|", "-", $link);
$link = str_replace("?", "-", $link);
$link = str_replace("+", "-", $link);
$link = str_replace("/", "-", $link);
$link = str_replace("!", "-", $link);
$link = str_replace(".", "-", $link);
// ÆØÅ
$link = str_replace("æ", "ae", $link);
$link = str_replace("ø", "oe", $link);
$link = str_replace("å", "aa", $link);
// Dobbelte streger
$link = str_replace("--", "-", $link);
$link = str_replace("---", "-", $link);
// Lowercase
$link = strtolower($link);
// Create link + id
$link = "$link-$id";
Der er dog nogle links hvor -- alligevel indgår:
http://index.wep.dk/godtur-dk--rejseside-46/
Hvorfor bliver de ikke snuppet og lavet om til en enkelt streg?
Siden som "producerer" de flotte links:
http://index.wep.dk/kategorier
Godtur.dk - Rejseside
" " => "-"
Godtur.dk---Rejseside
"--" => "-"
Godtur.dk--Rejseside
"---" => "-"
Godtur.dk--Rejseside
Prøv at bytte om på "---" og "--", eller endnu bedre, slut med en regex der bare ændrer et vilkårligt antal streger over 2, til én, dvs. "--+" eller "-{2,}" eller sådan noget. (Husk "global", til hvis der er mere end én række streger.)
(Der er så længe siden jeg har leget med PHP, at den nøjagtige syntax er et stykke væk, derfor bare et par stumper regex. Begge burde virke.)
" " => "-"
Godtur.dk---Rejseside
"--" => "-"
Godtur.dk--Rejseside
"---" => "-"
Godtur.dk--Rejseside
Prøv at bytte om på "---" og "--", eller endnu bedre, slut med en regex der bare ændrer et vilkårligt antal streger over 2, til én, dvs. "--+" eller "-{2,}" eller sådan noget. (Husk "global", til hvis der er mere end én række streger.)
(Der er så længe siden jeg har leget med PHP, at den nøjagtige syntax er et stykke væk, derfor bare et par stumper regex. Begge burde virke.)
Nåh ja, selvfølgelig.. Det var faktisk en god idé at skrive det op led for led... Det virkede på den i eksemplet.
Men denne virker det ikke på og det forstår jeg ikke:
http://index.wep.dk/festsange-sammensaetter-du-da-...
Kan du også gennemskue den? :)
Men denne virker det ikke på og det forstår jeg ikke:
http://index.wep.dk/festsange-sammensaetter-du-da-...
Kan du også gennemskue den? :)
OMG det er grimt det der!
I stedet for at black-liste enkelte tegn burde du whiteliste dem du synes må være i et url. fx [A-Za-z0-9] og "-".
Og så er det altså helt ekstremt grimt at bruge string replacements på den måde der. For det første har php en funktion, hvor du bruger to arrays i stedet for at gøre det 37 gange, for det andet burde du gøre det hele med en enkelt regex eller 2 :-)
I stedet for at black-liste enkelte tegn burde du whiteliste dem du synes må være i et url. fx [A-Za-z0-9] og "-".
Og så er det altså helt ekstremt grimt at bruge string replacements på den måde der. For det første har php en funktion, hvor du bruger to arrays i stedet for at gøre det 37 gange, for det andet burde du gøre det hele med en enkelt regex eller 2 :-)
Jeg ved ikke lige om det er pga. det collision som Arne_V snakker om, men nedenstående slipper altså stadig igennem:
http://index.wep.dk/festsange-sammensaetter-du-da-...
Min kode ser således ud:
Hvordan kan den -- slippe igennem den regex?
http://index.wep.dk/festsange-sammensaetter-du-da-...
Min kode ser således ud:
$link = preg_replace("#-{2,}#", "-", $link);
Hvordan kan den -- slippe igennem den regex?
Jace (3) skrev:Men denne virker det ikke på og det forstår jeg ikke:
http://index.wep.dk/festsange-sammensaetter-du-da-...
Det virker da fint. ;-)
Festsange sammensætter du da selv !
" " => "-"
Festsange-sammensætter-du-da-selv-!
"!" => "-"
Festsange-sammensætter-du-da-selv--
"--" => "-"
Festsange-sammensætter-du-da-selv-
$link = "$link-$id";
Festsange-sammensætter-du-da-selv--106
I øvrigt er det ikke kønt med mellemrum før udråbstegn. ;-)
(Og jeg synes også det ville være pænere med en regex. Eneste undskyldning for at lade være er, hvis du insisterer på at forstå den kode du selv skriver, og ikke kan gennemskue regex lige nu.)
myplacedk (14) skrev:Eneste undskyldning for at lade være er, hvis du insisterer på at forstå den kode du selv skriver, og ikke kan gennemskue regex lige nu.)
Ja, lige præcis. Det er lidt træls at have en masse kode på sin side som man ikke forstå et hak af... Selvom det er pæn kode :)
Nåh, men jeg har fået lært lidt mere regex, så jeg nu kan mere end den smule der kræves til mod_rewrite :)
Koden ser nu således ud, og virker perfekt:
Kan det gøres endnu pænere?
Jeg tænker på om det med ÆØÅ også kan laves i en enkelt regex på en måde? For hvis det kræver 3 regex at lave det, så er str_replace jo ligeså pænt :)
Koden ser nu således ud, og virker perfekt:
// Convert ÆØÅ
$link = str_replace("æ", "ae", $link);
$link = str_replace("ø", "oe", $link);
$link = str_replace("å", "aa", $link);
// Convert unwanted characters to -
$link = preg_replace("#[^A-Za-z0-9]+#", "-", $link);
// Create link + id
$link = "$link-$id";
// Convert multiple --- to -
$link = preg_replace("#-{2,}#", "-", $link);
// Lowercase
$link = strtolower($link);
Kan det gøres endnu pænere?
Jeg tænker på om det med ÆØÅ også kan laves i en enkelt regex på en måde? For hvis det kræver 3 regex at lave det, så er str_replace jo ligeså pænt :)
arne_v (9) skrev:#8
"Hvad er 2 + 2" bliver til "Hvad-er-2-2"
"Hvad er 2 - 2" bliver til "Hvad-er-2-2"
Ja, nu forstår jeg problemet :)
Jeg tror dog ikke det er et problem i mit tilfælde da jeg trækker data ud baseret på det unikke id som jeg smider på i enden af strengen. Alt teksten er bare for at lave en pæn URL :)
Gå til top
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.