[PHP-UBB]hoe 'stack' opbouwen (no n00bs :P)

Pagina: 1
Acties:

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Jaja, * Nielsz heeft een probleem :) Ik ben maar eens begonnen aan een ubbparser, en niet zo maar een ubbparser, maar eentje die gemakkelijk aan te passen is.
Hij is namelijk niet 'vast' geprogrammeerd, maar ik kan per entiteit aangeven welke entiteit er in gebruikt mogen worden.
Ik kan dus zeggen: in een [.code] mag alleen maar een [u|i|b|s] tag in voorkomen, en verder worden smilies niet geparsed.
Dat doe ik met de volgende code:
code:
1
2
3
4
5
6
7
class parseEntity
    {
    var $name;
    var $pattern;
    var $replace;
    var $children=array();
    var $parseSmilies;

Nu heb ik een andere class waar deze code in staat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        $b= new parseEntity("B");
        $b->setChildren(array("s","i"));
        $b->setRegexp("/\\[B\](.*?)\\[\/B\]/is","<b>\\1</b>");
        $this->addEntity($b);

        $s= new parseEntity("s");
        $s->setChildren(array("s","i"));
        $s->setRegexp("/\\[S\](.*?)\\[\/S\]/is","<s>\\1</s>");
        $this->addEntity($s);

    function addEntity($var)
        {
        $this->entities[$var->name]=$var;
        }

Daar krijg ik dus een array met alle entiteiten die gebruikt mogen worden.


Wat wil ik bereiken?
Ik wil een array (class) krijgen met dit formaat:
code:
1
2
var $text="bold en italic text";
var $usedElements=array("b","i");

Hoe moet dit :?

Er moet dus op de een of andere manier door de text heengelopen worden. Hij moet een complete entiteit zien te vinden, en daarin kijken of daar nog tags in zitten die mogen. Als dat zo is moet de text in (2|3) gesplitst worden. Maar hoe ik dit moet gaan aanpakken :? Ik zit iig een beetje vast. Kan iemand wat hints geven?
De code die ik nu heb om alles om te zetten is:
code:
1
2
3
4
5
        while (list ($name, $entity) = each ($parser->entities)) 
            {
            $text = preg_replace($entity->pattern, $entity->replace, $text);
            $entityCounter++;
            }

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

ff een vraag die we aan elke n00b vragen ( >:) ) : Wat heb je zelf al geprobeerd? Waarom denk je dat dat niet werkte en wat ging daar fout mee ?

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 21 maart 2002 10:09 schreef dusty het volgende:
ff een vraag die we aan elke n00b vragen ( >:) ) : Wat heb je zelf al geprobeerd? Waarom denk je dat dat niet werkte en wat ging daar fout mee ?
Wijs-neus :P
Ik weet niet hoe ik moet gaan splitten, ik kan moeilijk elke char inlezen, kijken of hij in de regexp-array zit, en dan op de stack zetten :?

  • Grum
  • Registratie: Juni 2001
  • Niet online
waarom doe je het dan niet anders ? alle mogelijke 'entities' eruit vissen en op de stack smijten

en dan terwijl je de stack afloopt even kijken of je entities wel bestaan/geparsed mogen worden, zo niet ... blokhaakies erom, printen en klaar is jan/kees/piet/klaas/n00b/Nielsz :+

  • Stewie!
  • Registratie: September 2001
  • Laatst online: 05:59

Stewie!

Keen must die!

[way off-topic]
Is Nielz zo'n Digger freak dat ie niet zelf een oplossing kan bedenken? :D ;)
[/way off-topic]


Strava: https://www.strava.com/athletes/149347154


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 21 maart 2002 10:34 schreef Grum het volgende:
waarom doe je het dan niet anders ? alle mogelijke 'entities' eruit vissen en op de stack smijten

en dan terwijl je de stack afloopt even kijken of je entities wel bestaan/geparsed mogen worden, zo niet ... blokhaakies erom, printen en klaar is jan/kees/piet/klaas/n00b/Nielsz :+
:+
code:
1
2
3
4
5
6
7
8
while($stack!=oldstack)
{
for(each(entity))
{
// Kijk of de regexp matched.
// Zo ja, gooi 'm op de stack
}
}

Zoiets?

  • Grum
  • Registratie: Juni 2001
  • Niet online
stackbased is meestal zonder regexps :P (misschien alleen om te stack te bouwen)

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 21 maart 2002 10:55 schreef Grum het volgende:
stackbased is meestal zonder regexps :P (misschien alleen om te stack te bouwen)
:D

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Anders kijk je even hoe ACM het heeft gedaan.. ;)

[topic=445817]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 21 maart 2002 12:40 schreef thomaske het volgende:
Anders kijk je even hoe ACM het heeft gedaan.. ;)

[topic=445817]
Die heeft hij ook pas nadien online gezet :)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Ik blijf bij mijn recursieve parser :P

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 21 maart 2002 13:21 schreef dusty het volgende:
Ik blijf bij mijn recursieve parser :P
Ik ga voor een recursieve stackbased parser :Y)
Ik ga 'm nu zo maken, dat hij gaat preg_matchen, en daarna recursief de boom doorlopen totdat er geen childs meer zijn. Ik heb de hele vakantie de tijd om er over na te denken, dus be prepared ;)

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

En mogen die children dan ook weer genest worden of niet?

Als je een [.s] hebt waar alleen maar een [.u] in mag, en in een [.u] mag een [.i] en een [.b], mogen die dan ook direct in de [.s]? Of alleen weer genest?

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 21 maart 2002 16:50 schreef eamelink het volgende:
En mogen die children dan ook weer genest worden of niet?

Als je een [.s] hebt waar alleen maar een [.u] in mag, en in een [.u] mag een [.i] en een [.b], mogen die dan ook direct in de [.s]? Of alleen weer genest?
Ja dat mag :)

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op donderdag 21 maart 2002 17:12 schreef Nielsz het volgende:
Ja dat mag :)
Nou je moet er wel voor zorgen dat je in feite alleen 'minder' mag naarmate je dieper de tree in gaat.
Stel tussen [.img] wil je geen [.b] hebben, maar wel een [.i] (beetje dom voorbeeld, maar ok).
Dan zou dit eigenlijk ook niet mogen imho
[.img]tekst [.i]en nu komt [.b]vet[/b] wat[/i] eigenlijk niet mag[/img]

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 21 maart 2002 19:20 schreef Orphix het volgende:

[..]

Nou je moet er wel voor zorgen dat je in feite alleen 'minder' mag naarmate je dieper de tree in gaat.
Stel tussen [.img] wil je geen [.b] hebben, maar wel een [.i] (beetje dom voorbeeld, maar ok).
Dan zou dit eigenlijk ook niet mogen imho
[.img]tekst [.i]en nu komt [.b]vet[/b] wat[/i] eigenlijk niet mag[/img]
Dat mag niet, behalve als je zegt dat je [.b] in [.i] mag hebben. Of gaat dit niet goed komen op deze manier?

Verwijderd

Ik heb voor iets anders eerst alle tags die herkend werden in een array gezet, met de content ertussendoor. Dus in de array was een veld òf een tag, òf een stuk tekst dat niet meer geparsed hoeft te worden.

Dan ga je de array aflopen, en je roept iedere keer een functie aan, afhankelijk van de tag die je tegenkomt. Bijvoorbeeld als je een [.code] tag vind, dan spring je door naar de eerst volgende [./code] tag, en ga je daar verder.

Als je in een bepaalde openingstag vindt, zet je hem aan het eind van een array $stack, en als je een sluit tag tegen komt, dan haal je de laatste tag van die array af, en je kunt meteen zien of de structuur wel goed is, zodat je geen problemen krijgt als <b><i>bla</b></i> voorkomt. Bovendien kun je aan de hand van die array zien binnen welke tags je zit, zodat je kunt bepalen wat wel en niet geparsed mag worden.

Ik weet alleen wel dat dit niet echt snel zal verlopen allemaal, maar volgens mij kan er op deze manier weinig foutgaan.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Cheatah, maar hoe loop je die door dan? kijk je bij elke char of het een [ is, en of er dan een ] achteraankomt?

Verwijderd

Op donderdag 21 maart 2002 23:17 schreef Nielsz het volgende:
Cheatah, maar hoe loop je die door dan? kijk je bij elke char of het een [ is, en of er dan een ] achteraankomt?
Nee, ik heb eerst met regular expressions voor en na elke geldige tag een marker gezet, daarna gesplit op die marker, en dan heb je een array die er globaal als volgt uitziet:
code:
1
2
3
4
5
6
7
[tag]
tekst tekst tekst
[b]
nog meer tekst
[/b]
[i]
etc. etc.

Als je dit hebt is er echt geen kunst meer aan, maar volgens mij is het wel enorm traag allemaal.

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 10-09 22:17

Pelle

🚴‍♂️

Tijdje geleden zat drm met een soortgelijk probleem voor z'n template parser.. ff topic zoeken.. ah, found it:

[topic=331671/1/25]

Fijne uitleg van mbravenboer over stacks. Toepassing is wellicht wat anders, maar idee erachter is denk ik wel goed te hergebruiken.

In de codebase staat drm's php stack-wrapper-class volgens mij ook ergens; is misschien ook nog wel te gebruiken :)
Pagina: 1