I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
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> ....
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:
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...
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.