mboost-dp1

PHP: Problemer med str_replace


Gå til bund
Gravatar #1 - Jace
7. sep. 2008 20:20
Jeg bruger str_replace til at fjerne uønskede tegn fra mine links så de bliver flottere (ligesom her på newz.dk):

// 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
Gravatar #2 - myplacedk
7. sep. 2008 20:27
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.)
Gravatar #3 - Jace
7. sep. 2008 20:38
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? :)
Gravatar #4 - arne_v
7. sep. 2008 21:46
jace>

Har du noget som håndterer collision ?
Gravatar #5 - Jace
7. sep. 2008 21:47
arne_v (4) skrev:
jace>

Har du noget som håndterer collision ?

Jeg forstår ikke hvad du mener, så det har jeg nok ikke :)
Gravatar #6 - arne_v
7. sep. 2008 21:53
#2


function multi_hyp_strip($s) {
return preg_replace("#-{2,}#", "-", $s);
}
Gravatar #7 - arne_v
7. sep. 2008 21:54
#5

To links som er forskellige inden du replacer men ens efter.
Gravatar #8 - Jace
7. sep. 2008 21:57
arne_v (7) skrev:
#5

To links som er forskellige inden du replacer men ens efter.

Kan du forklare det med et lille eksempel? Jeg forstår ikke helt hvad problemet skulle være :)
Gravatar #9 - arne_v
7. sep. 2008 22:01
#8

"Hvad er 2 + 2" bliver til "Hvad-er-2-2"

"Hvad er 2 - 2" bliver til "Hvad-er-2-2"
Gravatar #10 - TullejR
7. sep. 2008 22:12
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 :-)
Gravatar #11 - Jace
7. sep. 2008 22:37
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:
$link = preg_replace("#-{2,}#", "-", $link);


Hvordan kan den -- slippe igennem den regex?
Gravatar #12 - Jace
7. sep. 2008 22:40
TullejR (10) skrev:
OMG det er grimt det der!

Ja, det vil jeg godt give dig ret i :)

Jeg er dog stadig så nybegynder i regex at jeg ikke kan gennemskue hvordan jeg får det lavet smartere...

Er du sød og smide et par eksempler på hvordan det kunne løses med regex?
Gravatar #13 - arne_v
8. sep. 2008 03:15
#10


function special_strip($s) {
return preg_replace("#[^A-Za-z0-9]+#", "-", $s);
}
Gravatar #14 - myplacedk
8. sep. 2008 04:56
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.)
Gravatar #15 - Jace
10. sep. 2008 00:07
myplacedk (14) skrev:
Det virker da fint. ;-)

Selvfølgelig! Ved sku ikke lige hvorfor jeg ikke kunne se den fejl :)
Gravatar #16 - Jace
10. sep. 2008 00:08
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 :)
Gravatar #17 - Jace
10. sep. 2008 00:11
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:

// 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 :)
Gravatar #18 - Jace
10. sep. 2008 00:45
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.

Opret Bruger Login