Avatar billede hoppe11 Nybegynder
18. oktober 2007 - 09:55 Der er 14 kommentarer og
1 løsning

preg_replace - replace innerhtml i tags

jeg skal have lavet en preg som replacer innerhtml i tags

eksempler:
<b>fed tekst</b> => <b>[replace]</b>
<img> => <img>

mit eget forslag som ikke helt virker:
(<[^>]+>)(([^<]+)(<\/\\1+>))
Avatar billede nielle Nybegynder
18. oktober 2007 - 11:08 #1
Måske noget i denne stil?

<([^ ]*)(.*)>(.*?)</\\1>

og en replace del med:

<$1$2>[$3]</$1>
Avatar billede hoppe11 Nybegynder
18. oktober 2007 - 11:27 #2
det virker, men hvad gør det spørgsmålstegn i \\3 ??
Avatar billede nielle Nybegynder
18. oktober 2007 - 11:38 #3
Det gør at ".*" bliver "lazy" (dvs. "doven") - dvs at den kun tager det mindst mulige. Uden ?-teget er den grådig, hvilket betyder at den matcher alt hvad den kan komme til:

Du kan selv se foprskellen ved at prøve med og uden ?-tegnet på dette:

.... <b>fed tekst</b> ... <b>og så noget mere fed tekst</b> ....
Avatar billede nielle Nybegynder
18. oktober 2007 - 11:41 #4
Du har selv forsøgt dig med ([^<]+) for at opnå samme effekt, men den løsning fejler ved sådan noget som:

<a href="xxx"><img src="..." border="0"></a>
Avatar billede nielle Nybegynder
18. oktober 2007 - 11:42 #5
I øvrigt ville jeg nok bruge denne i stedet:

<([^ >]*)(.*)>(.*?)</\\1>
Avatar billede hoppe11 Nybegynder
18. oktober 2007 - 12:33 #6
hvis du har tid har jeg egentlig lige to patterns du gerne må se på.. de virker egentlig som de skal, men du kan sikkert lige "optimere" dem lidt :)

matche alle html tags
<[^>]+>([^<]+<\/[^>]+>)?

matche href tags
(<a [^>]+>)([^<]+)(<\/a>)
Avatar billede nielle Nybegynder
18. oktober 2007 - 14:35 #7
Den første ser fornuftig ud. Men hvis du nu ikke bruger /-tegn i hver ende af mønsteret, så slipper du for at escape det /-tegn som er inde i selve mønsteret:

preg_replace("#<[^>]+>([^<]+</[^>]+>)?#", ...);

Det betyder ikke så meget lige i dette tilfælde, men i sammenhænge, hvor at der et mange /-tegn i møsteret, gør det som regel underværker for læsbarheden. :^)

Den anden - du skriver at det er en href der skal matches på, men i virkeligheden masher mønsteret på alle typer af a-tags:

(<a [^>]*href=[^>]*>)([^<]+)(</a>)

Som nævnt i 18/10-2007 11:41:16 fejler denne dog, hvis du inkludere en anden tag - f.eks. en img-tag - linket:

(<a [^>]*href=[^>]*>)(.*?)(</a>)
Avatar billede hoppe11 Nybegynder
18. oktober 2007 - 15:47 #8
hvilke tegn ud over / og # kan man bruge omkring mønstrer?
Avatar billede hoppe11 Nybegynder
18. oktober 2007 - 15:50 #9
men lige en ting angående det ? i (.*?) så den ikke tager mere end nødvendigt

vil det sige at den nærmest læser forud i mønstret og sikrer sig at den ikke tager noget af det næste i mønsteret med?
Avatar billede nielle Nybegynder
18. oktober 2007 - 16:13 #10
18/10-2007 15:47:22> Stort set hvilket som helst tegn.

18/10-2007 15:50:09> Den sædvanlige måde er at .* fortsætter med at matche så længe den kan. Nogen gangen løber den for langt og så bakker den tilbage og prøver om den kan blive færdig med et mindre grådigt strategi.

Med et ?-tegn forsøger .* at matche så lidt som muligt før at den prøver at gøre resten af mønsteret færdigt. Hvis den ikke kan det så prøver den at matche et tegn mere.

En analogi: Forestil dig at du står i den ene ende af en gang med 3 døre i højre side. Du har et mål (et møstre) som siger at du skal gå lige ud af gangen og så dreje til højre.

Med "mønsteret":

.*{DREJ TIL HØJRE}

vil du spæne helt ned til enden af gangen - du vil faktisk til at starte med løbe forbi alle tre døre. Dernæst vil du gå baglens og træde et trin tilbage ad gangen indtil at du kommer til en dør. Denne går du igennem.

Med møsteret:

.*?{DREJ TIL HØJRE}

vil du gå et skridt frem, og så se om du er ud for en dør. Når du kommer til en dør vil du gå igennem denne.

Håber på at det gjorde det lidt mere klart? Læg mærke til at det er to forskellige døre man ender med at matche, og at man i øvrigt ikke får matchet på den midterste dør...
Avatar billede hoppe11 Nybegynder
18. oktober 2007 - 16:49 #11
god forklaring :)

men kan ungreedy ikke i nogle tilfælde blive forvekslet med almindelig ? {0,1}
Avatar billede nielle Nybegynder
18. oktober 2007 - 16:54 #12
Ikke forvekslet - for det er nemlig akkurat den samme. :^)

"ungreedy" kaldes som sagt for "lazy" i den officielle lingo.
Avatar billede nielle Nybegynder
18. oktober 2007 - 16:56 #13
Mønsteret "hane?" Vil matche på han med mindre der er mere møstre efter ?-tegnet såm teyder at der skal matches på "hane" før at det hele går op.
Avatar billede hoppe11 Nybegynder
18. oktober 2007 - 17:18 #14
tak for hjælpen her også :)

smid et svar
Avatar billede nielle Nybegynder
18. oktober 2007 - 17:27 #15
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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