/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
regular expression
Fra : Peter


Dato : 15-11-04 22:07

Hej!

Jeg er rendt ind i et lille problem med regexp... Det skal dog siges jeg
er lidt ny med preg_match.. men synes den virker ret cool...

Jeg skal have nogen bestem tags ud af en html fil de er alle opbygget:

<com:xxxxxxxxxxx />

et eksempel:
<html>
<head>
</head>
<body>
<a href="http://test.dk">test
<com:button value:test /><img src="pic.gif" />
<br /><com:button value:test2 />
</body>
</html>

Som det kan ses er der 2 <com: /> tags dem vil jeg så have i et array:

preg_match_all("/<com:.+ \/>/",$content,$result);
var_dump($result);

men det giver:

array(1) {
[0]=>
array(2) {
[0]=>
string(46) "<com:button value:test /><img src="pic.gif" />"
[1]=>
string(26) "<com:button value:test2 />"
}
}

Ikke helt planen... jeg kan godt se hvorfor den gør den... den første
streng er jo fint gyldig... men hvordan dælen får jeg den til at lade
være

/Peter.

 
 
Peter Brodersen (15-11-2004)
Kommentar
Fra : Peter Brodersen


Dato : 15-11-04 22:33

On Mon, 15 Nov 2004 22:07:08 +0100, Peter <nospam@nospam.invalid>
wrote:

>preg_match_all("/<com:.+ \/>/",$content,$result);

.. matcher jo også >-tegnet, så hvad med:
   preg_match_all('/<com:[^\/]+ \/>/',$content,$result);
Eller evt.:
   preg_match_all("/<com:.+? \/>/",$content,$result);
for at lave en lazy match.

--
- Peter Brodersen

Peter (16-11-2004)
Kommentar
Fra : Peter


Dato : 16-11-04 11:05

Peter Brodersen wrote:
>>preg_match_all("/<com:.+ \/>/",$content,$result);
>
> .. matcher jo også >-tegnet, så hvad med:
>    preg_match_all('/<com:[^\/]+ \/>/',$content,$result);

Yes.. den virker og jeg forstår hvad den gør

> Eller evt.:
>    preg_match_all("/<com:.+? \/>/",$content,$result);
> for at lave en lazy match.

Den virker også... men jeg ved ikk hvorfor? hvordan virker ?-tegnet i
dette tilfælde?

/Peter.

Peter Brodersen (16-11-2004)
Kommentar
Fra : Peter Brodersen


Dato : 16-11-04 17:38

On Tue, 16 Nov 2004 11:05:06 +0100, Peter <nospam@nospam.invalid>
wrote:

>>    preg_match_all("/<com:.+? \/>/",$content,$result);
>> for at lave en lazy match.
>
>Den virker også... men jeg ved ikk hvorfor? hvordan virker ?-tegnet i
>dette tilfælde?

..+ matcher så mange tegn som muligt. Så for:
<foo><bar>
... vil .+ (ved et udtryk i stil med <.+> ) matche det første <, så
langt som muligt (resten af linjen), og så "gå baglæns", indtil det
næste tegn er >. Det vil sige, at "foo><bar" bliver matchet med .+

Ved .+? matches der så kort som muligt, indtil udtrykket stadigvæk er
gyldigt. Så når "foo" er matched, behøves der ikke at matche mere, før
udtrykket er gyldigt.

Altså:
..+ - først matches alle tegn, så matches ét mindre, så matches ét
mindre, etc., indtil udtrykket er gyldigt
..+? - først matches ét tegn, så matches to tegn, så matches tre tegn,
etc., indtil udtrykket er gyldigt.

..* og .*? fungerer på tilsvarende måde, og det samme med øvrige
quantifiers, fx .{3,7}?

Kig på:
http://dk2.php.net/manual/en/reference.pcre.pattern.syntax.php
... og søg efter teksten: By default, the quantifiers are "greedy"

--
- Peter Brodersen

Peter (17-11-2004)
Kommentar
Fra : Peter


Dato : 17-11-04 09:44

Peter Brodersen wrote:
> Ved .+? matches der så kort som muligt, indtil udtrykket stadigvæk er
> gyldigt. Så når "foo" er matched, behøves der ikke at matche mere, før
> udtrykket er gyldigt.

Så kort så muligt... så giver det mening for mig... takker

/Peter

Jacob Atzen (15-11-2004)
Kommentar
Fra : Jacob Atzen


Dato : 15-11-04 22:35

On 2004-11-15, Peter <nospam@nospam.invalid> wrote:
> preg_match_all("/<com:.+ \/>/",$content,$result);

Prøv med:

preg_match_all("/<com:.+? \/>/",$string,$result);

Den eneste ændring er spørgsmålstegnet, der gør, at det foregående
bliver "ungreedy".

--
Med venlig hilsen
- Jacob Atzen

Peter (16-11-2004)
Kommentar
Fra : Peter


Dato : 16-11-04 11:06

Jacob Atzen wrote:
> preg_match_all("/<com:.+? \/>/",$string,$result);
>
> Den eneste ændring er spørgsmålstegnet, der gør, at det foregående
> bliver "ungreedy".

Det virker... men se mit svar til Peter B. jeg ved nemlig ik hvorfor det
virker med ?-tegnet

/Peter.

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste