Gå til innhold

[løst] Regex: Fra lazy til greedy


Anbefalte innlegg

Hei,

 

Har et ørlite problem med et lite message-board jeg implementerer på en side. Har nemlig en quote-funksjon, som tilsynelatende fungerer helt fint helt til en nøster to quotes inn i hverandre.

 

Eksempel

[quote]
[quote]Først post.[/quote]
Andre post.
[/quote]
Tredje og siste post.

Meningen er at det skal se ut som følgende.

Først post.
Andre post.
Tredje og siste post.

 

Problemet er at regex-uttrykket matcher første start-tag og første slutt-slutt tag, noe som ødelegger nøstingen. Resultatet blir noe lignende som dette. Andre åpnings-tag og siste slutt-tag blir igjen, da regex naturligvis ikke matcher det som ligger nøstet inni hverandre.

 

Slik er det nå

[ quote]Først post.
Andre post.[ /quote]Tredje og siste post.

 

/\[quote\](.*?)\[\/quote\]/is

$post = preg_replace ( '/\[quote\](.*?)\[\/quote\]/is', '<div class="quote">$1</div>', $post );

 

Har sett litt på regular-expressions.info, som skriver litt om det som omhandler akkurat dette, men klarer ikke å bruke det i mitt eget uttrykk. Noen som kjapt ser en åpenbar løsning som gjør uttrykket greedy? :)

 

Takk på forhånd.

 

- Jonas

Endret av Jonas
Lenke til kommentar
Videoannonse
Annonse

Hva om du bare kjører str_replace() da?

 

f.eks:

 

 

$string = str_replace("[quote]","<div class=\"quote\">", $string);
$string = str_replace("[/quote]","</div>", $string);

Endret av Raring
Lenke til kommentar

Raring - str_replace() er alltid en mulighet i slike tilfeller, men dette ødelegger layoutet mitt dersom en ikke fullfører tags og det liker jeg ikke.

 

ttrunde - hvordan kan det hjelpe meg? Altså, å kjenne antallet. Edit: Jeg antar du tenker slik at en kan telle antall forekomster av fullførte tags og erstatte med str_replace()? Ved å begrense antall erstatninger unngår man at ikke-fullførte tags ødelegger layout.

 

Edit: Forslaget fungerte. Utrolig stygg måte å gjøre det på, håper egentlig det finnes en bedre løsning.

 

while ( preg_match ( '/\[quote\](.*?)\[\/quote\]/is', $post ) ) {
$post = preg_replace ( '[\[quote\]]', '<div class="quote">', $post, 1 );
$post = preg_replace ( '[\[\/quote\]]', '</div>', $post, 1 );
}

Endret av Jonas
Lenke til kommentar

du kan da ta vekk ? fra .*?, da vil det bli greedy, men det blir nok bare problem det og vist du har følgende eks:

 

[quote]
 Første
[quote] 
  Andre
[/quote]
[/quote]
[quote]
  tredje
[/quote]

da den vil matche første

og siste[ /quote]
Endret av Runar0
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...