[php] preg_replace voor meerdere quotes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goeiemiddag,

Ik ben bezig een met een ubb parser. En ik gebruik
code:
1
$text= preg_replace("/\\[quote\](.+?)\\[\/quote\]/","<blockquote>$1</blockquote>", $text);
om [quote] te detecteren.

Nu werkt het wel bij de volgende string:
code:
1
 $text = "[quote] Stukje citaat [/quote]";

Maar niet bij:
code:
1
 $text = "[quote] Stukje citaat [quote] Nog een stukje citaat in het andere citaat [/quote] [/quote]";
Hij pakt dan alleen de eerste quote - en niet de quote in de quote -

Wat doe ik fout in mijn stukje preg_replace ? Wacht eens even. Newlines hebben er iets mee te maken.
code:
1
 $text =  "[quote] BLAAAT \n Blaadieblaa [/quote]";
werkt niet :P

ps. Sorry dit topic heb ik per ongeluk in het verkeerde forum geplaatst.

[ Voor 48% gewijzigd door Verwijderd op 07-06-2006 09:58 . Reden: ontdenkte dat met newlines preg_replace ook al de boot ingaat. ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zoek eens op wat de ungreedy modifier voor je kan betekenen.
Daar heb je weinig aan met nesting. :P

Regexps en nesting gaan eigenlijk nooit lekker.

[ Voor 45% gewijzigd door NMe op 05-06-2006 13:09 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

ot:
<p class=quote>$1</p>
daar hebben we blockquote voor he ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Altenatief is een for loopje. Maar gaat dat geen enorme rekenkracht kosten.... :O

Blijft lastig. Voor url's en img's werkt het perfect. Maar ik zit dus met die quote.

str_replace gebruiken kan ook. Maar dan detecteer je niet of een gebruiker [/quote] vergeet.

[ Voor 3% gewijzigd door Verwijderd op 05-06-2006 13:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op maandag 05 juni 2006 @ 13:07:
Zoek eens op wat de ungreedy modifier voor je kan betekenen.
Daar heb je weinig aan met nesting. :P

Regexps en nesting gaan eigenlijk nooit lekker.
Dat ligt er maar aan hoe je die regular expressions gebruikt. Wat je heel vaak ziet is een simpele preg_replace die dan ervoor moet zorgen dat UBB code wordt omgezet naar HTML. Ik vind dit echt helemaal niks, en zou dit zelf niet vlug gebruiken, hooguit als je weet dat de input "valid" is, maar in andere gevallen dus niet.

Wat je wel kunt doen, is de boel eerst tokenizen met preg_split ( $pattern, $source, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE );
Vervolgens kun je door de rij tokens heenlopen, een stack bijhouden, en dus direct controleren of een element wel of niet is toegestaan. Zo heb je controle over de maximale diepte van de nesting van [quote] tags en kun je eventuele foutjes herstellen. En door de offset capture kun je eventueel aangeven waar de fout zit, en op die manier nuttige feedback geven aan de eindgebruiker.

Overigens is het een kwestie van smaak, maar ik zou altijd perl compatible regular expressions gebruiken (preg_ in PHP). Daarmee kun je gewoon meer, en het is de meest geaccepteerde syntax voor regular expressions.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Zoek eens naar stack based parsers, die kunnen wat jij wilt.

Idee is om te zoeken naar he laatste openingstag, en van daar terug naar voren te werken. Dan is nesting geen probleem, oomdat na de laatste openingstag alleen de bijbehorden sluittag zal volgen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op maandag 05 juni 2006 @ 13:20:
[...]Overigens is het een kwestie van smaak, maar ik zou altijd perl compatible regular expressions gebruiken (preg_ in PHP). Daarmee kun je gewoon meer, en het is de meest geaccepteerde syntax voor regular expressions.
Gebruikte ik die niet toevalig ;)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op maandag 05 juni 2006 @ 13:20:
Dat ligt er maar aan hoe je die regular expressions gebruikt. Wat je heel vaak ziet is een simpele preg_replace die dan ervoor moet zorgen dat UBB code wordt omgezet naar HTML. Ik vind dit echt helemaal niks, en zou dit zelf niet vlug gebruiken, hooguit als je weet dat de input "valid" is, maar in andere gevallen dus niet.
Ik gebruik het nog regelmatig, en daarbij accepteer ik dan ook dat er grenzen aan zitten. Meestal als ik ze gebruik ben ik zelf toch de enige die het zaakje gaat gebruiken. :P
Wat je wel kunt doen, is de boel eerst tokenizen met preg_split.
Vervolgens kun je door de rij tokens heenlopen, een stack bijhouden, en dus direct controleren of een element wel of niet is toegestaan. Zo heb je controle over de maximale diepte van de nesting van [quote] tags en kun je eventuele foutjes herstellen. En door de offset capture kun je eventueel aangeven waar de fout zit, en op die manier nuttige feedback geven aan de eindgebruiker.
Dat is inderdaad een betere methode IMO, maar regexps hebben daar niet zo heel veel mee te maken. Regexps zijn daar namelijk niet de kern van de oplossing, maar simpelweg een manier om het tokenizen makkelijker te maken.
Overigens is het een kwestie van smaak, maar ik zou altijd perl compatible regular expressions gebruiken (preg_ in PHP). Daarmee kun je gewoon meer, en het is de meest geaccepteerde syntax voor regular expressions.
Eens, maar dat doet ie toch ook? Ondanks zijn topictitel gebruikt ie in zijn post "netjes" preg_*. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op maandag 05 juni 2006 @ 13:27:

Eens, maar dat doet ie toch ook? Ondanks zijn topictitel gebruikt ie in zijn post "netjes" preg_*. :P
:X Niet eens naar gekeken, omdat preg_replace sowieso een waardeloze manier is om dit soort dingen goed voor elkaar te krijgen ;)
Dat is inderdaad een betere methode IMO, maar regexps hebben daar niet zo heel veel mee te maken. Regexps zijn daar namelijk niet de kern van de oplossing, maar simpelweg een manier om het tokenizen makkelijker te maken.
Regular expressions zijn inderdaad gewoon een handig hulpmiddel om met weinig omslachtige code een hoop intelligente algoritmes op een stukje tekst los te laten. Uiteraard kun je altijd zonder, maar in gevallen als deze is het vaak mogelijk om in no-time een goede oplossing werkend te krijgen. Ik begrijp je punt niet.

[ Voor 46% gewijzigd door Verwijderd op 05-06-2006 13:34 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Jouw post weerlegde mijn stelling dat regexps en nesting nooit goed werken. Ik doelde op replaces zoals TS hierboven gebruikt, maar jij doelde op een heel andere toepassing waarin regexps niet meer dan een hulpmiddel zijn om tot een oplossing te komen, in plaats van de oplossing zelf. Feitelijk is mijn punt dat ik het met je eens ben, maar dat dat niet iets is wat ik in mijn eerste post probeerde uit te sluiten. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Recursie in reguliere expressies:
PHP:
1
$content = preg_replace_callback('/\\[quote\]((([^[]|\\[(?!\/?quote))*|(?R))*)\\[\/quote\]/i', 'quote', $content);

Hoe je dit verder kan toepassen is best te vinden hier op het forum aangezien ik het al vaak genoeg gepost heb. Een stack-based parser blijft echter een betere oplossing voor dit soort problemen.

En een schopje naar Programming ;)

[ Voor 5% gewijzigd door crisp op 05-06-2006 13:44 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op maandag 05 juni 2006 @ 13:43:
Recursie in reguliere expressies:
PHP:
1
$content = preg_replace_callback('/\\[quote\]((([^[]|\\[(?!\/?quote))*|(?R))*)\\[\/quote\]/i', 'quote', $content);

Hoe je dit verder kan toepassen is best te vinden hier op het forum aangezien ik het al vaak genoeg gepost heb. Een stack-based parser blijft echter een betere oplossing voor dit soort problemen.

En een schopje naar Programming ;)
Zou je me kunnen vertellen waar ik het op het forum zou kunnen vinden. Of hoe ik moet zoeken ? In ieder geval tot zover iedereen bedankt voor zijn reacties.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op maandag 05 juni 2006 @ 13:53:
[...]
Zou je me kunnen vertellen waar ik het op het forum zou kunnen vinden. Of hoe ik moet zoeken ? In ieder geval tot zover iedereen bedankt voor zijn reacties.
[search=geneste quotes regular expressions]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1