[php] nested [iets argument1=[blaat]] preg_replace

Pagina: 1
Acties:

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
ik heb voor mijn template engine het volgende nodig:
een preg_replace die bijvoorbeeld zoiets zou kunnen parsen.


ik heb nu:
PHP:
1
 $output=preg_replace("/\\[(.*?)\]/e","strfunct('$1', \$vars)",$input);

deze roept een functie aan met alles wat er tussen de haken staat, nu wil ik het alleen zo voor elkaar krijgen dat hij van een genest paar alleen de buitenste haken bekijkt en alles wat er tussen staat (dus daaronder genest is) gewoon als $1 vangt.

bijvoorbeeld:
code:
1
 [link target=body url='http://www.tweakers.net/user.php?id=[id]'] stukje text [object var1=blaat]


en dat hij dan dus vind:

link target=body url='http://www.tweakers.net/user.php?id=[id]'
object var1=blaat

het vinden en opdelen van al dan niet gequote parameters heb ik al voor elkaar maar ik wil dus dat hij geneste [] met rust laat.

iemand enig idee hoe ik dan bovenstaande replace moet verbouwen?
mischien is het nodig om het op te delen met behulp van een of ander eng while loopje?

alvast heel erg bedankt.

openkat.nl al gezien?


  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 31-03 16:47

CyberSnooP

^^^^ schrijft --->

Je kunt wat stoeien met de Greediness optie van regular expressions, die bepaald of hij juist een zo groot mogelijk (.*) blok vind, of een zo klein mogelijk.

Jammer genoeg ga je er niet uitkomen ;)
Het probleem is dat je OF correct kunt nesten en fouten hebt met meerdere blokken achter elkaar OF andersom.

De oplossing is een stack-based parser schrijven die dus eigenlijk teken voor teken verwerkt in de string en iedere keer een huidige toestand vastlegt.. Zoeken op stack based parser brengt je waarschijnlijk al een stuk verder.

|_____vakje______|


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
hmm dus toch zelf weer een for loopje bouwen, naja t moet dan maar
ik post hem wel als ik hem af heb.

ik hoef in principe alleen maar alles in een [] paar te negeren maar dat moet natuurlijk wel intelligent gebeuren omdat je natuurlijk de [] paren daarin intact wil laten.

openkat.nl al gezien?


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
here comes
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function parse($input, $vars=""){
    $length=strlen($input);
    $count=0;
    for($i=0;$i<$length;$i++){
            if($input[$i]=="["){
                if($count==0){
                    $begin=$i+1;
                }
                $count++;
            } elseif($input[$i]=="]"){
                if($count==1){
                    $end=$i;
                    $count--;
                    $amount=$end-$begin;
                    $part=substr($input,$begin,$amount);
                    $output.=strfunct($part, $vars);
                } else {
                    $count--;
                }
            } elseif($count==0) {
                 $output.=$input[$i];
            }

    }

    //$output=preg_replace("/\\[(.*?)\]/e","strfunct('$1', \$vars)",$input);
    return $output;
}

openkat.nl al gezien?


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
strpos() niet hendiger dan een for-loop?

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 07-08 19:18
brammetje schreef op 17 september 2002 @ 13:59:
strpos() niet hendiger dan een for-loop?
hmm jah mischien wel jah
eens kijken of het op die manier ook makkelijk kan, al zal het intern niet veel schelen denk ik.

openkat.nl al gezien?

Pagina: 1