infostabil > edb.programmering.* > edb.programmering.perl

Kurt Hansen (17.09.2012, 12:20)
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.".

Den streng vil jeg så erstatte med 'ingenting'.

Jeg har forsøgt mig i Mac's Terminal, men det kunne jeg slet ikke finde
ud af med alle de parametre.

HTML-editoren BlueFish (jeg arbejder på Mac) kan imidlertid håndtere
Perl i sin søgefunktion. Da jeg ikke kan se at den kan læse fra
diskfiler, har jeg taget alle mine HTML-dokumenter og koblet dem sammen
i eet langt dokument.

Så indtaster jeg i søgefeltet: <head>[^<].*</head>

Der er således mange forekomster af <head></head>. Det underlige er, at
når jeg starter søgningen hopper den helt ned til linje 297, hvor der er
en <head>. selv om der er en i linje 5.

Ok, pyt med det, men når den så finder den der er i linje 297, markerer
den ALT derfra til og med det sidste </head> på linje 46.395.

Jeg er helt blank med Perl, men mener dog at vide, at [^<] får den til
at stoppe ved < i sluttagget?

Spørgsmålet er nu: Hvorfor stopper den ikke ved FØRSTE forekomst, men
ved sidste forekomst?
Peter Makholm (17.09.2012, 13:38)
Kurt Hansen <kurt> 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
Kurt Hansen (17.09.2012, 14:20)
Den 17/09/12 13.38, Peter Makholm skrev:
> Kurt Hansen <kurt> 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>


> 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 ville være helt usædvanligt. <head> og </head> forekommer kun een
gang i et HTML-dokument.

Jeg skal da hilse at sige at det virker. Jeg nåede ikke engang at blinke
med øjnene, før den havde erstattet alle forekomster i 46.000 linjer.

Jeg er meget glad for hjælpen og takker og bukker. Imponerende hurtigt,
fyldestgørende og forståeligt svar.
Lignende emner