Kurt Hansen <ku...@ugyldig.invalid> writes:
> Jeg ønsker at finde en streng i HTML:
>
> <head>*</head> forstået som "start- og sluttag inklusive ALT hvad der
> står imellem dem, inklusive linjeskift o.a.".
Regulære udtryk er ikke velegnede til at behandle SGML/XML lignende
sprog.
> Så indtaster jeg i søgefeltet: <head>[^<].*</head>
Oversættelse: Find strengen '<head>', efterfulgt af ét tegn der ikke er
'<', efterfulgt af så mange tegn som overhovedet muligt, efterfulgt af
'</head>'.
> Jeg er helt blank med Perl, men mener dog at vide, at [^<] får den til
> at stoppe ved < i sluttagget?
Havde du skrevet '[^<]*' havde den matchet indtil det næste '<'. Men det
ville højst sandsynligt ikke have været slut-tagget.
> Spørgsmålet er nu: Hvorfor stopper den ikke ved FØRSTE forekomst, men
> ved sidste forekomst?
Fordi kvantifiers (altså stjernen) notmalt er grådige. De matcher så
meget som overhovedet muligt. Hvis du sætter et spørgsmålstegn efter
stjernen vil den matche ikke-grådigt, altså så lidt som overhovedet
muligt.
Det vil sikkert løse dit umidelbare problem. Det vil sige:
<head>.*?</head>
Men det virker kun fordi (og hvis) du ikke har indlejrede <head>
tags. Det bliver noget noget forfærdelig rod hvis du skal gøre noget
tilsvarende med <div> tags der kan være indlejrede.
Husk: Regulære udtryk er ikke velegnede til at behandle SGML/XML
lignende sprog!
//Makholm