Avatar billede mrmasters Nybegynder
22. juni 2012 - 13:07 Der er 6 kommentarer og
1 løsning

PURL Plugin: Problemer med ÆØÅ i Regex (PHP)

Hej Eksperter,

Jeg har siddet og døjet med et lille simpelt PURL plugin til WordPress siden morgenstunden, og må nu give op. Jeg har haft min kammerat ind over også og vi er begge løbet tør for idéer.

Problem:
Fungerer korrekt: http://www.domain.dk/Jens.Hansen
Returnerer: Jens og Hansen
Fungerer korrekt: http://www.domain.dk/Jørgen.Jørgensen
Returnerer: Jøren og Jørgensen
Fejler: http://www.domain.dk/Jens.Jørgensen
Returnerer: Jens og J

Såfremt efternavnet indeholder æøå og fornavnet også gør, så fungerer systemet fint. Så snart fornavnet ikke indeholder æøå alt i mens efternavnet gør - så breaker den ved det problematiske tegn. Vi har forsøgt alt i vores magt, og vi kan ikke finde en løsning.

Funktionalitet:
PURL Pluginnet skal fungerer således at når Jens Hansen træder ind på http://www.domain.dk/Jens.Hansen
Så vil han se sit navn på siden "Velkommen Jens Hansen".

Tankegangen bag:
Det skal være så simpelt som muligt, derfor bliver navnet Jens Hansen sat ind i content via WordPress' shortcodes, for at brugeren kan ændre sammenhængen.

Pluginnet:
Først flusher vi wordpress' rewrite rules.
Dernæst tilføjer vi et filter på Wordpress' query_vars, således at vi kan fange vores variabel i URL'en "Jens.Hansen".
Dernæst tjekker vi på om query_vars returnerer vores variabel, altså om variablen er fanget.
Da vi valgte at splitte regex'en op i 2 capturing groups, tjekker vi på både purlfornavn og purlefternavn. Dette gjorde vi efter at have prøvet alt vi kunne komme i tanke om med 1 capturing group. For at løse vores problem.
Hvis query_vars returnerede vores variabler, gemmer vi dem i 2 sessions.
Oven i det har vi vores rewrite rules, hvori vores Regex ligger. Den ser pt. således ud:

$new_rules = array(
          '([a-zA-Zæøå]+)[\.]{1}([a-zA-Zæøå]+)' => 'index.php?p=' . get_option('page_on_front') . '&purlfornavn=' .
          $wp_rewrite->preg_index(1) . '&purlefternavn=' . $wp_rewrite->preg_index(2)

Vi har lokaliseret problemet hertil - vi mener i hvertfald at regexen er problem, da vi tidligere testede (under 1 capturing group) med:
http://www.domain.dk/index.php?p=53&navn=Jens+Jørgensen
fik returneret: Jens Jørgensen uden problemer.

Håber der er nogle der har en løsning, for vi er helt flade for muligheder.

På forhånd mange tak,

Michael
Avatar billede erikjacobsen Ekspert
22. juni 2012 - 14:27 #1
Der er nok flere ting i dette. Må man ikke hedde Günther eller Hans-Kurt? Og kan man ikke have flere navne?

Da det kan være lidt besværligt at tænke på alle muligheder, så kunne I måske lave:

(.+?)[\.]{1}(.+?)

Dvs blot matche hvad som helst før punktum, og hvad som helst punktum.

Endelig er der så det med tegnsæt og URL-encoding ...
Avatar billede mrmasters Nybegynder
22. juni 2012 - 14:33 #2
Hej Erik,

Tak for dit svar - vi har forsøgt med URL-encoding, men den tager det for bogstavligt og outputter $mactches[1] fremfor "Jens".

Du har ret - selvfølgelig skal man også kunne hedde Günther og Hans-Kurt. Tak for input, den havde jeg overset.

Tegnsætning er UTF-8, synes jeg har forsøgt at tage højde for det hele vejen.

Forsøger lige din regex og giver svar - På forhånd mange tak for dit input!

Michael
Avatar billede mrmasters Nybegynder
22. juni 2012 - 14:36 #3
Hej Erik,

Løsningen med (.+?)[\.]{1}(.+?) breaker også ved special tegn. Hvis jeg lagde pluginnet op på pastebin, ville det være en fordel for dig?

Pft.
Avatar billede erikjacobsen Ekspert
22. juni 2012 - 14:41 #4
Nej. Jeg ved ikke noget om Wordpress plugins.

Hvad står der i URL-en når det "breaker" ;) ?

URLencode skal slet ikke opføre sig, som du beskriver. Du må anvende det forkert.
Avatar billede mrmasters Nybegynder
22. juni 2012 - 14:52 #5
Et eksempel:
domain.dk/Jens.Jørgensen

vi output følgende:
"Jens J"

ingen fejl, intet output - den "breaker" bare fuldstændig ved et special tegn.

Vil lige prøve med URLencode igen
Avatar billede erikjacobsen Ekspert
22. juni 2012 - 15:24 #6
Øh ... tjah .... det er ikke til at sige hvad der er galt.

Hvis det virker med 1 capturing group, kunne man jo lade PHP splitte på på punktummet.
Avatar billede mrmasters Nybegynder
05. september 2012 - 09:55 #7
Ingen af løsningerne fungerede. Vi fandt et købe plugin der håndterer outputs eksternt. Det skal dog siges, din løsninger fungerede alle uden om WordPress.

Tak for hjælpen Erik og beklager det sene svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester