Toon posts:

[php]ubbtag in ubbtag EN losse tag erna

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik vroeg me af of iemand wel eens een oplossing voor bijvoorbeeld dit:
code:
1
2
3
4
5
6
[tag]
  [tag]
  [/tag]
[/tag]
[tag]
[/tag]

(en dan dus zo dat alle tags geparsed worden en ook alleen maar als er een sluittag voor aanwezig is)

met Regexpen heeft gemaakt, of kun je dit alleen maar met een stackbased tagparser aanpakken?

  • Bender
  • Registratie: Augustus 2000
  • Laatst online: 17-08 16:09
www.phpfreakz.com
kijk daar eens op,
staan iig een stuk of 10 van die scripts

Verwijderd

Topicstarter
Ja, dat zou natuurlijk leuk zijn als er iets kant en klaars voor was maar ik ben niet op zoek naar een script hè, die scripts van phpfreakz zijn allemaal te basic, daar gaat het compleet mis als je geneste tags gaat gebruiken (bijvoorbeeld bij een quote)... Dus...

Verwijderd

Het kan heel makkelijk:
code:
1
2
3
4
while(eregi("[b]", $message) && eregi("[/b]", $message))
  {
    // replace
  }

Er is voor deze toepassing van eregi() een preg_***() functie, maar kan er ff niet opkomen. Die werkt iig wat beter als dit, maar is hetzelfde principe.

Verwijderd

Topicstarter
ja ik zat al wat te knutselen met preg_replace_callback enzo want volgens mij gaat het niet echt werken zoals jij zei. Ik heb deze regexp gemaakt om een divje te herkennen (dus met argumenten):
PHP:
1
<?$regexp = '/\\[div(( [a-z]+ ?= ?"?[^"\]]+"?)*)\](.*)\\[\/div\]/Usi';?>

Deze werkt wel lekker natuurlijk maar ik moet dus bij een divtag een impliciete sluittag hebben (anders moetie worden afgekeurd.) Op deze manier (met de U setting) paktie in mijn eerste voorbeeld (met die [tag]s) wel de laatste, en de eerste paktie natuurlijk al de eerste sluittag. Wat dus duidelijk niet de bedoeling is, dan kun je wel met die while aan de gang maar dan is er geen voorkomen meer van bovenstaande regexp...

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Volgens mij heb je een recursieve functie nodig die je steeds loslaat op de inhoud van [tag] en de 'buitenste' [/tag]. Zo kan je een onberkt aantal niveau's nesten. Maar let wel op dat je een manier implementeerd om niet in een oneindige lus verzeild te raken...

Dus ongeveer dit idee:
PHP:
1
<?fuction parseDivs($text, $limit){    $max = 10;    if (++$limit > $max)        return $text;    $text = preg_replace(        '/\\[div(( [a-z]+ ?= ?"?[^"\]]+"?)*)\](.*)\\[\/div\]/Usie',        "'<div>' . parseDivs($1, $limit) . '</div>'",        $text    );    return $text;}?>

On track


Verwijderd

Topicstarter
Ja ik dacht zelf ook al wel dattet met een recursieve functie zou moeten... Ik ga weer even knutselen en alst mis gaat dan post ik het hier weer hoor :D

edit:

Op deze pagina zijn trouwens de "vorderingen" te volgen...

Verwijderd

Op zondag 23 juni 2002 23:16 schreef int het volgende:
Het kan heel makkelijk:
code:
1
2
3
4
while(eregi("[b]", $message) && eregi("[/b]", $message))
  {
    // replace
  }

Er is voor deze toepassing van eregi() een preg_***() functie, maar kan er ff niet opkomen. Die werkt iig wat beter als dit, maar is hetzelfde principe.
dit gaat mis met:
code:
1
[/b][b]

dan matcht hij wel beide tags, maar niet in de goede volgorde
Op zondag 23 juni 2002 23:57 schreef WouZz het volgende:
Volgens mij heb je een recursieve functie nodig die je steeds loslaat op de inhoud van [tag] en de 'buitenste' [/tag]. Zo kan je een onberkt aantal niveau's nesten. Maar let wel op dat je een manier implementeerd om niet in een oneindige lus verzeild te raken...

Dus ongeveer dit idee:
PHP:
1
<?fuction parseDivs($text, $limit){    $max = 10;    if (++$limit > $max)        return $text;    $text = preg_replace(        '/\\[div(( [a-z]+ ?= ?"?[^"\]]+"?)*)\](.*)\\[\/div\]/Usie',        "'<div>' . parseDivs($1, $limit) . '</div>'",        $text    );    return $text;}?>
Door steeds de buitenste tags te parsen en vervolgens de tekst binnenin te wijzigen loop je spaak bij een simpel voorbeeld als:
code:
1
2
3
[b]tekst1[/b][b]tekst2[/b]
=>
<b>tekst1[/b][b]tekst2</b>

met deze code lijkt het echter wel te werken, dit is trouwens een regexp voor ubb codes die identiek zijn aan html codes op de haakjes ([ en ]) na dus bijvoorbeeld [b] en [i]:
PHP:
1
<?while(preg_match("/\\[(.+?)].*?\\[\/\\1]/is",$text)){    $text = preg_replace("/\\[(.+?)](.*?)\\[\/\\1]/is","<\\1>\\2</\\1>",$text);}?>

Verwijderd

heb ff op je vorderingen site gekeken, vervolgens je code gecombineerd met mijn code en tadaa, en werkende code!:
PHP:
1
<?function parseDivs($text){    $regexp = '/\\[div(( [a-z]+ ?= ?"?[^"\]]+"?)*)\](.*?)\\[\/div\]/sie';    $replacement = "'<div'.ereg_replace('position:[^\";]+;?', '', '$1').'>$3</div>'";    while(preg_match('/\\[div(( [a-z]+ ?= ?"?[^"\]]+"?)*)\].*?\\[\/div\]/sie',$text))    {        $text = preg_replace($regexp, $replacement, $text);    }    return $text;}$subject = "tekst\n[div border=\"0\" style=\"width: 65;position:relative;\"]\nTEKSTINDEDIV\n[div]divindiv![/div]TEKSTINDEDIV\n[/div]\nnog meer tekst[div class=\"id\" style=\"background:#000000;position:absolute;\"]\nhihihih\n[/div] blaat!";$repcl = parseDivs($subject, 0);echo "<pre>", $subject,"</pre><HR><pre>",htmlspecialchars($repcl),"</pre><HR>";show_source("divtest.php");?>

ajb ;)

Verwijderd

Topicstarter
Heb even wat zaken gecombineerd enzo en dit schijnt te werken:
PHP:
1
<?function parseDivs($repcl, $l = 0){  $regexp = '/\\[div(( [a-z]+ ?= ?"?[^"\]]+"?)*)\](.*?)\\[\/div\]/ise';  $replacement = "'<div'.ereg_replace('position:[^\";]+;?', '', '$1').'>$3</div>'";      while(preg_match('/\\[div(( [a-z]+ ?= ?"?[^"\]]+"?)*)\](.*?)\\[\/div\]/is',$repcl) &amp;&amp; ++$l < 10){    $repcl = preg_replace($regexp, $replacement, $repcl);  }  return $repcl;}?>

Zoals hier te zien is...

Verwijderd

Topicstarter
Op maandag 24 juni 2002 00:50 schreef Takkie het volgende:
heb ff op je vorderingen site gekeken, vervolgens je code gecombineerd met mijn code en tadaa, en werkende code!:
[lap code]
ajb ;)
Waren we er dus ongeveer op hetzelfde moment achter, iig bedankt! nou nog even in verschillende gevallen testen :D

edit:

Sorry dat ik hiervoor een nieuwe reply doe maar anders is natuurlijk de opmaak van me code weer vernacheld :)

Verwijderd

Op maandag 24 juni 2002 01:00 schreef zellufs het volgende:

[..]

Waren we er dus ongeveer op hetzelfde moment achter, iig bedankt!*1 nou nog even in verschillende gevallen testen :D

edit:

Sorry dat ik hiervoor een nieuwe reply doe maar anders is natuurlijk de opmaak van me code weer vernacheld*2 :)
*1: No prob :7
*2: Dat zou verboden moeten worden!
Pagina: 1