Toon posts:

[php] Beginnen met een ubb parser

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik weet dat er al veel topics aan gesleten zijn: UBB en UBB Parsers. Maar ik heb vrijwel nog nergens (heb veel gezocht) echt gezien hoe je er precies aan begint. Ik ben namelijk bezig er één te schrijven en ik weet niet precies hoe ik moet beginnen. Uiteraard heb ik wel al een aantal dingen geprobeerd, maar ik schijn er niet uit te komen...

Zoals ik nu telkens begin is met:
PHP:
1
<?$delen = explode(" ", $bericht);?>

En dan een loopje, en checken of er wat 'geparsed' kan worden. Maar ik ben er wel uit dat dit niet de ideale manier is :P

Heeft iemand wat tips voor mij om er mee te beginnen? De manier(en) om te parsen heb ik dan wel, maar dus niet het beginnetje om te gaan parsen, want ik neem aan dat m'n manier niet de juiste is, iig niet de handigste.

Dus de vraag is eigenlijk: Hoe kan ik 't beste de tekst opdelen zodat ik kan parsen?

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 14-12-2025
uhm, dat kan toch ook met preg_replace() dan hoef je niet eens op te delnen.

:?

Verwijderd

Topicstarter
Nou, als je ervoor wilt zorgen dat er geen 2e quote tag tussen de [quote] tag komt (zoals hier), dan zul je denk ik toch de tekst op moeten delen, neem ik aan...

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 14-12-2025
Hoezo het is toch mogelijk om een reguliere expressie te maken die het niet toestaat om een quote in een quote te gebruiken.

Verwijderd

Topicstarter
Klopt...

Maar, hoe zorg je er dan voor dat de content + de overbodige tags worden verwijderd uit de variabele?

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 14-12-2025
uhm *kent nog geen reguliere expressies*

Zoiets denk ik aan:
code:
1
2
3
4
5
6
7
8
[ quote]tekst[ quote]tekst 2[ /quote]tekst 3[ /quote]

vervangen we door:
[ qoute]
tekst
...
tekst 3
[ /quote]

Verwijderd

Topicstarter
Dan is mijn vraag: Hoe?

Zoiets is mij nog niet gelukt, betwijfel het eigenlijk ook wel of dat met alleen (een) regex(es) kan...

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

[search=php ubb]

Klaar voor een nieuwe uitdaging.


  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 14-12-2025
Heb je gedult, ik wil namelijk over een week (na mijn examens) regexen gaan bestuderen, maar ik geloof dat er een aantal anderen zijn die er wel verstand van hebben.

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Jah, dat kan met preg_replace() icm de e modifier..

On track


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 14:17
Markuz:
Dan is mijn vraag: Hoe?

Zoiets is mij nog niet gelukt, betwijfel het eigenlijk ook wel of dat met alleen (een) regex(es) kan...
Met alleen een regex kan dat natuurlijk niet nee.
Het is in zo'n geval beter een stackbased parser te maken.

Zie ook [topic=445817/1/100]

Verwijderd

Topicstarter
Thnx voor de link, dat topic had ik nog niet gelezen, hier kan ik maybe wel wat mee.

  • SJR
  • Registratie: Januari 2000
  • Laatst online: 15-02 13:58

SJR

Ik heb eens een beschrijving van de werking van mijn parser gemaakt, omdat ik ACM om raad vroeg. Die c/p ik hier wel ff:

--------------------------------------------------------
Mijn parser werkt volgens dit principe: de parse() functie roept 4 andere
functie's aan: _autoTags(), _buildTags(), _validateTags() en _replaceTags().

$returnstring _autoTags($str)
Deze functie zorgt dmv pcre regex'en voor de automagische tags, zoals een
url en emailadres. Ook vervangt hij bepaalde alternatieve tags, zoals
[ *].

$returnarray _buildTags($str)
Zoek de het eerste [ teken. Zoek de eerst daarop volgende [ en ]. Als [
eerder komt dan ], dan wordt de text in de array gedumpt als text, komt de ]
eerder dan wordt de functie makeTag() aangeroepen met de tussenliggende
text. Als __makeTag() false teruggeeft (geen geldige tag) dan wordt de text
als text in de array gedumpt, anders als tag. Verder wordt er door deze
functie ook nog gezorgd dat er niet 2 text elementen na elkaar in de array
kunnen staan, als dat zo is, dan worden ze aan elkaar geplakt.
Dit blijft zich herhalen met steeds een andere startpositie totdat de hele
string is doorlopen. De uiteindelijke array wordt gereturned.

$returnarray _validateTags($arr)
Deze functie doorloopt de hele array $arr.
Als het item een stuk van het type text betreft, dan wordt deze toegevoegd
aan de returnarray. Hier wordt ook weer gezorgd dat 2 stukken text elkaar
niet kunnen opvolgen.
Is het een openende tag dan wordt gekeken of'ie is toegestaan binnen de
huidige tag via de functie allowedTag(). Als'ie niet is toegestaan, dan
wordt het type op text gezet, en daarne wordt'ie toegevoegd aan de
returnarray. Als'ie wel is toegestaan dan wordt eerst nog gechecked of'ie
niet al een keer is geopened. Zoja, dan wordt'ie genegeerd, zonee, dan
wordt'ie toegevoegd aan de returnarray en aan de $opentags array.
Is de tag sluitend, dan wordt eerst weer allowedTag() aangeroepen. Geeft
deze false en is de huidige tag niet de laatst geopende, dan wordt het type
op text gezet, en wordt'ie toegevoegd aan de returnarray.
Is de tag wel toegestaan dan wordt er gekeken of'ie hetzelfde is als de
huidige openstaande (end($opentags)). Is dit het geval, dan wordt'ie
toegevoegd aan de returnarray en $opentags wordt eentje ingekort.
Is'ie niet hetzelfde als de huidige openstaande, maar komt'ie wel in de
$opentags array voor, dan worden eerst alle tussenliggende close tags
toegevoegd aan de returnarray, dan wordt de huidige tag toegevoegd, en dan
worden alle tussenliggende open tags weer toegevoegd.
Komt'ie niet de array $opentags voor, dan gebeurt er niets.
Na het doorlopen van de array worden alle tags uit $opentags nog afgesloten.

$returnstring _replaceTags($arr)
Weer de hele array $arr wordt doorlopen.
Is het type text, dan wordt de text toegevoegd aan de returnstring.
Ander wordt er met een simpele switch () gekeken met welke tag we te maken
hebben. De simpele (b,u,i,s,sub,sup) worden door strtr() afgehandeld ([]
wordt opgezet in <>. Bij de overige tags wordt per stuk bekeken wat er moet
gebeuren. Soms moet er 1 item vooruit wordeen gekeken (bij email
bijvoorbeeld) om de juiste waarde op te halen. Na het doorlopen van de array
wordt returnstring teruggegeven.
--------------------------------------------------------

Deze beschrijving is alweer een beetje achterhaald omdat ik m'n parser inmiddels weer heb herschreven, maar het idee is hetzelfde gebleven. Btw, dit is de url van de huidige versie van m'n parser: http://sjr.dyndns.org/parser/parser.php. Hij's volgens mij ongeveer even snel als die van ACM (waarvan de source overigens op GoT te vinden is).

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 14:17
Heel vet verhaal!

  • SJR
  • Registratie: Januari 2000
  • Laatst online: 15-02 13:58

SJR

ff nog wat (oude) linkjes opgezocht:
[topic=156093/1/25]
[topic=445584/1/25]
Pagina: 1