[PHP] Hulp nodig met regexp

Pagina: 1
Acties:

Onderwerpen


  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
Beste Tweakers,

Ik ben bezig met een template engine (en kom aub niet met "waarom wil je het wiel opnieuw uitvinden" want hier heb ik mijn redenen voor)

Het gaat om het volgende stukje tekst wat ik gebruik om mijn regexp te testen:

code:
1
2
3
4
5
6
7
8
9
10
{foreach id="$varaible" value="$data"}
{if exp="blaat"}
  {if exp="blabla"}
    show something
  {/if}
  {if exp="blabla"}
    show something
  {/if}
{/if}
{/foreach}


Ik wil nu dus de hele tekst door een regexp gooien zodat die de tag + eind tag + de inhoud van de tag "grept"

Nu heb ik de volgende regexp:
PHP:
1
$text = preg_replace_callback("#\{(\S*)\s(.*?)\}(.*?)\{\/\\1\}#si", "handle", $text);


De code van de handle functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function handle($matches) {
    global $ifs, $fors;
    
    $tag = $matches[1];
    $innerData = $matches[3];
    
    switch($tag) {
        case 'foreach':
            $fors++;
            return "<?php foreach(blaat): // start foreach {$fors} ?>". $innerData ."<?php endforeach; // end foreach {$fors} ?>";
            break;
        case 'if':
            $ifs++;
            return "<?php if(blaat): // start if {$ifs} ?>". $innerData ."<?php endif; // end if {$ifs} ?>";
            break;
    }
}
?>


Nu werkt het op zich wel maar het probleem is dat de regexp niet de goede eindtag erbij pakt als ik meerdere van dezelfde tags gebruik.

Dit is wat ik terug krijg bij een echo op $text:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php foreach(blaat): // start foreach 1 ?>
<?php if(blaat): // start if 1 ?>
  <?php if(blaat): // start if 3 ?>
    show something
  <?php endif; // end if 1 ?>
  <?php if(blaat): // start if 2 ?>
    show something
  <?php endif; // end if 2 ?>
<?php endif; // end if 3 ?>
<?php endforeach; // end foreach 1 ?>


Ik hoop dat er hier mensen zijn die mij een beetje op weg kunnen helpen want ik begrijp echt niets meer van regexp.

[ Voor 10% gewijzigd door chuxiej op 10-11-2005 14:51 ]

www.dannyhiemstra.nl


  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Je kan dit niet met een regexp doen. Met een regexp kun je alleen greedy (de laaste) of ungreedy (de eerste) terugpakken.

Je moet een stackbased parser gebruiken. Dus lees elke tag uit, hou bij hoe diep je zit, en spuug dan het juiste stukje uit. ACM heeft ooit een stackbased UBB parser geschreven, misschien dat je iets aan zijn code als voorbeeld hebt.

  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
Bedankt, dit zal zeker een oplossing zijn.
Jammer dat de URL waar de parser van ACM stond niet meer werkt.

www.dannyhiemstra.nl


  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Je hebt mail. Je email bounced.

Wellicht kun je ook naar de HTML_UBB package van PEAR kijken.

[ Voor 14% gewijzigd door Skaah op 10-11-2005 16:42 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

php pcre ondersteund wel recursive patterns, maar over het algemeen is stack-based een betere oplossing.

Intentionally left blank


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

NMe

Quia Ego Sic Dico.

Skaah schreef op donderdag 10 november 2005 @ 16:42:
Je hebt mail. Je email bounced.

Wellicht kun je ook naar de HTML_UBB package van PEAR kijken.
Of even spieken naar .oisyn's stackbased UBB parser. :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.

Pagina: 1