[PHP]UBB-codes

Pagina: 1
Acties:
  • 1.108 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hallo,

Ik ben een ubb tags en smileys aan het maken voor mijn forumsoftware, maar nu ben ik vastgelopen toen ik een code-tag wou maken. In deze tag mogen namelijk geen smileys of anderer ubb codes uitgevoerd worden. Kheb al verschillende dingen bedacht maar het lijdt allemaal niet tot het gewenste resultaat :s. Hieronder staat mijn voorlopige ubb-functie:

code:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php

//UBB codes
function ubb($bericht, $ubbtags, $smileys){

    $ubb_code=array(
                    '/\[b\](.+?)\[\/b\]/si',
                    '/\[i\](.+?)\[\/i\]/si',
                    '/\[u\](.+?)\[\/u\]/si',
                    '/\[s\](.+?)\[\/s\]/si',
                    '/\[url\](.+?)\[\/url\]/si',
                    '/\[url=http:\/\/(.+?)\](.+?)\[\/url\]/si',
                    '/\[url=www.(.+?)\](.+?)\[\/url\]/si',
                    '/\[url=ftp:\/\/(.+?)\](.+?)\[\/url\]/si',
                    '/\[img(.*?)\]http:\/\/(.+?)\[\/img\]/si',
                    '/\[img(.*?)\](.+?)\[\/img\]/si',
                    '/\[center\](.*?)\[\/center\]/si',
                    '/\[left\](.*?)\[\/left\]/si',
                    '/\[right\](.*?)\[\/right\]/si',
                    '/\[sub\](.*?)\[\/sub\]/si',
                    '/\[sup\](.*?)\[\/sup\]/si',
                    '/\[ot\](.*?)\[\/ot\]/si'
                    );
    
    $ubb_html=array(
                    '<strong>\\1</strong>',
                    '<i>\\1</i>',
                    '<u>\\1</u>',
                    '<s>\\1</s>',
                    '<a href=\\1 target="_black">\\1</a>',
                    '<a href=http://\\1 target="_black" style="text-decoration:underline;">\\2</a>',
                    '<a href=http://www.\\1 target="_black" style="text-decoration:underline;">\\2</a>',
                    '<a href=ftp://\\1 target="_black" style="text-decoration:underline;">\\2</a>',
                    '<img src="http://\\2" style="margin: 2px; border:1px solid black" alt="" \\1>',
                    '<img src="http://\\2" style="margin: 2px; border:1px solid black" alt="" \\1>',
                    '<div style="text-align:center;">\\1</div>',
                    '<div style="text-align:left;">\\1</div>',
                    '<div style="text-align:right;">\\1</div>',
                    '<sub>\\1</sub>',
                    '<sup>\\1</sup>',
                    '<span class="offtopic">\\1</span>'
                    );
                    
    $smiley_ubb=array(
                        ":@",
                        ":d",
                        ":$",
                        ":z",
                        "8)",
                        ":p",
                        ":'(",
                        "-_-'",
                        ":s",
                        ";{",
                        ":(",
                        ":x",
                        ":)",
                        ":o",
                        ";)"
                        );
    
    $smiley_html=array(
                        '<img src="'.$forumadres.'/images/smilies/angry.gif" border="0" alt=":@">',
                        '<img src="'.$forumadres.'/images/smilies/bigsmile.gif" border="0" alt=":d">',
                        '<img src="'.$forumadres.'/images/smilies/blush.gif" border="0" alt=":$">',
                        '<img src="'.$forumadres.'/images/smilies/bored.gif" border="0" alt=":z">',
                        '<img src="'.$forumadres.'/images/smilies/cool.gif" border="0" alt="8)">',
                        '<img src="'.$forumadres.'/images/smilies/crazy.gif" border="0" alt=":p">',
                        '<img src="'.$forumadres.'/images/smilies/cry.gif" border="0" alt=":\'(">',
                        '<img src="'.$forumadres.'/images/smilies/damn.gif" border="0" alt="-_-\'">',
                        '<img src="'.$forumadres.'/images/smilies/dazled.gif" border="0" alt=":s">',
                        '<img src="'.$forumadres.'/images/smilies/ironic.gif" border="0" alt=";{">',
                        '<img src="'.$forumadres.'/images/smilies/sad.gif" border="0" alt=":(">',
                        '<img src="'.$forumadres.'/images/smilies/shutup.gif" border="0" alt=":x">',
                        '<img src="'.$forumadres.'/images/smilies/smile.gif" border="0" alt=":)">',
                        '<img src="'.$forumadres.'/images/smilies/suprised.gif" border="0" alt=":o">',
                        '<img src="'.$forumadres.'/images/smilies/wink.gif" border="0" alt=";)">'
                        );
    
    if($ubbtags=="ja"){         
        $bericht=preg_replace($ubb_code,$ubb_html,$bericht);
    }
    
    if($smileys=="ja"){
        $bericht=str_replace($smiley_ubb,$smiley_html,$bericht);
    }
    
    return $bericht;
}


Ik hoop dat iemand mij een paar tips kan geven zodat ik weer verder kan...

Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Niet direct een oplossing voor je probleem, maar een stack based ubb parser geeft je al veel meer controle over je parser. Wellicht je parser omschrijven naar een stack based one en dan kan je dat wel opnemen. Met een preg_replace gaat het anders lastiger worden om bepaalde tags te omzeilen etc.

Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.


Acties:
  • 0 Henk 'm!

  • Pyrus
  • Registratie: November 2001
  • Laatst online: 20-09 21:30

Pyrus

Hardknock life

Misschien een beetje lompe manier, maar zeker werkend:
Eerst parsen op code-tags, alles wat daartussen zit in een losse variabele zetten. Eventueel vervangen door een placeholder. De rest door je parser jagen en je losse variabele weer op de juiste plaats terug zetten :)

LinkedIn


Acties:
  • 0 Henk 'm!

Verwijderd

Hmm ik herken dit mannetje :)

Over MSN had ik toen de tijd imo een goede oplossing gegeven. Waarom gebruik je dat niet dan?

Acties:
  • 0 Henk 'm!

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 18-09 14:48

Rowdy.nl

Koekje d'r bij?

@Brakkie; 8 open bugs, waaronder JS en HTML injection mogelijk? Tricky... ;)

@TheBorg; is die versie bugvrij?

@ZKtaS; wat was die oplossing? ;)

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Rowdy.nl schreef op dinsdag 02 januari 2007 @ 16:34:
@TheBorg; is die versie bugvrij?
Ik had hem ook al getest, alleen is de parser php5. Nu is het jammer dat mijn hosting nog php4 draait dus ik kan het niet testen. Op het eerste gezicht ziet het er goed uit. Je kan gemakkelijk functies toevoegen, en door twee simpele statements geef je aan dat binnen die tag er geen andere ubb codes geparsed mogen worden. Precies wat TS wil (al heb je dus wel php5 nodig).

Zelf ben ik ook opzoek naar een stack-based parser, maar deze "werkt" dus niet. Omschrijven naar php4 kan, maar liever zie ik een andere die wel met php4 werkt :)

[ Voor 13% gewijzigd door mithras op 02-01-2007 16:51 ]


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Rowdy.nl schreef op dinsdag 02 januari 2007 @ 16:34:
@Brakkie; 8 open bugs, waaronder JS en HTML injection mogelijk? Tricky... ;)
Die bugs staan inderdaad open maar als je er op klikt dan zie je dat ze wel opgelost zijn.

edit:
hoewel.... beetje onduidelijk.

[ Voor 7% gewijzigd door Brakkie op 02-01-2007 18:00 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

Verwijderd

Rowdy.nl schreef op dinsdag 02 januari 2007 @ 16:34:
@Brakkie; 8 open bugs, waaronder JS en HTML injection mogelijk? Tricky... ;)

@TheBorg; is die versie bugvrij?

@ZKtaS; wat was die oplossing? ;)
Ik dacht hieraan: (welliswaar niet netjes, maar werkt wel)

Eerst behandel je de [code] BB code. En daarbij zet je de smileys om in de code tags naar een code als _SMILEYCODE01_. Dan haal je de normale smileys overheen. En daarna zet je de smileycodes om naar een smiley zoals : ).

Omslachtig? Naja het werkt wel :+

Acties:
  • 0 Henk 'm!

  • switchboy
  • Registratie: September 2002
  • Laatst online: 08-09 21:50

switchboy

-ruimte te huur-

Misschien een idee om (, ), :, ;, /, \, <, >, ?, " en ' wat tussen [code] tag's staat te vervangen door de HTML code van dat teken. Op die manier ziet het er voor de eindgebruiker normaal uit, maar zal hij verder niet als smilie geparsed worden. Dit zou je denk ik wel kunnen berijken door het door htmlentities() heen te halen.

Op die manier sla je twee vliegen in één klap. Je hebt geen last meer van dat als je HTML code tussen [code] tags hebt staan dat die door de browser uitgevoerd wordt. En als je dit voor de rest van de parsing doet heb je ook daar geen last meer mee. Want er valt niks te parsen alle [ en ]'s zijn sowieso al weg :P

Haal wel van te voren de extra slashes weg (stripslashes) als je die in je database met addslashes hebt gemaakt.

[ Voor 3% gewijzigd door switchboy op 02-01-2007 20:52 ]

My Steam Profile (Name Switch) Worth: 889€ (225€ with sales)Games owned: 83


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
switchboy schreef op dinsdag 02 januari 2007 @ 20:51:
Misschien een idee om (, ), :, ;, /, \, <, >, ?, " en ' wat tussen [code] tag's staat te vervangen door de HTML code van dat teken. Op die manier ziet het er voor de eindgebruiker normaal uit, maar zal hij verder niet als smilie geparsed worden. Dit zou je denk ik wel kunnen berijken door het door htmlentities() heen te halen.

Op die manier sla je twee vliegen in één klap. Je hebt geen last meer van dat als je HTML code tussen [code] tags hebt staan dat die door de browser uitgevoerd wordt. En als je dit voor de rest van de parsing doet heb je ook daar geen last meer mee. Want er valt niks te parsen alle [ en ]'s zijn sowieso al weg :P

Haal wel van te voren de extra slashes weg (stripslashes) als je die in je database met addslashes hebt gemaakt.
zet htmlentities() ook haakjes om:s? dat lijkt toch nie echt het geval te zijn bij mij ... ik heb namelijk eerst htmlentities op mijn bericht dat ik juist uit de database haal uitgevoerd, en erna pas de ubb functie. Dan zou toch geen enkele smiley moeten lukken want dan zou hij alle rondehaakjes hebben moeten omgezet in een html entiteit...

Ik heb je ide toch even geprobeerd maar smileys worden nog steeds weergeven :s :

code:
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
29
30
31
32
33
34
35
36
37
38
39
function ubb($bericht, $ubbtags, $smileys){
$ubb_code=array(
    '/\[plain\](.*?)\[\/plain\]/si',
    '/\[b\](.+?)\[\/b\]/si',
    '/\[i\](.+?)\[\/i\]/si',
                ....
                );

$ubb_html=array(
    htmlentities("\\1"),
                '<strong>\\1</strong>',
    '<i>\\1</i>',
               ....
               );

$smiley_ubb=array(
    ":@",
    ":d",
    ":$",
                 .....
                 );

$smiley_html=array(
    '<img src="'.$forumadres.'/images/smilies/angry.gif" border="0" alt=":@">',
    '<img src="'.$forumadres.'/images/smilies/bigsmile.gif" border="0" alt=":d">',
    '<img src="'.$forumadres.'/images/smilies/blush.gif" border="0" alt=":$">',
                ....
                );

if($ubbtags=="ja"){         
      $bericht=preg_replace($ubb_code,$ubb_html,$bericht);
}
    
if($smileys=="ja"){
      $bericht=str_replace($smiley_ubb,$smiley_html,$bericht);
}

return $bericht;
}

Acties:
  • 0 Henk 'm!

  • switchboy
  • Registratie: September 2002
  • Laatst online: 08-09 21:50

switchboy

-ruimte te huur-

Als het goed is zouden : nu als &#58 erin staan.
&#58 is namelijk de html code voor :

Misschien kan je proberen handmatig
: door &#58
( door &#40
) door &#41
- door &#45
/ door &#47
" door &#34
' door &#39
; door &#59
< door &#60
> door &#62
laten vervangen?

[ Voor 7% gewijzigd door switchboy op 02-01-2007 23:01 ]

My Steam Profile (Name Switch) Worth: 889€ (225€ with sales)Games owned: 83


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Dat is allemaal nog steeds omslachtig en lelijk. Je kan beter deze (als eerder aangehaald) gebruiken en omschrijven van php5 -> php4.

Voor zover ik kan zien zijn alle gebruikte functies ook mogelijk binnen php4. Het enige wat je hoeft te doen is dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ubb{
private $_parsed = array();
private $_alias = array(
  "hr" => "line",
  "*" => "li_short",
  "email" => "mail",
  "google" => "search");
private $_ubb = true;
private $_file;
private $_tpl = array();
private $_replaces = array();
private $_regexes = array();

public function __construct($file = "ubb.tpl"){
  do_something() // geknipt omdat het anders te lang wordt
}
omzetten naar dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class ubb{
var $parsed = array();
var $alias = array(
  "hr" => "line",
  "*" => "li_short",
  "email" => "mail",
  "google" => "search");
var $ubb = true;
var $file;
var $tpl = array();
var $replaces = array();
var $regexes = array();

function ubb($file = "ubb.tpl"){
  //constructor
  do_something() // geknipt omdat het anders te lang wordt
}


En houd er rekening dat er zowel een public function parse() als private function _parse() bestaat. Als je een van de twee hernoemt, en de variabelen ook goed hernoemt moet het al werken.

Ik wil graag ook deze gaan gebruiken, dus binnenkort zal ik dit ook zelf om gaan zetten.

/edit: ok, ik heb het toch even snel gedaan. Niet alles getest, maar volgens mij werkt het wel. Je kan het bestand hier vinden: http://download.juriansluiman.nl/ubb.class.phps

[ Voor 6% gewijzigd door mithras op 02-01-2007 23:39 ]


Acties:
  • 0 Henk 'm!

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 18-09 14:48

Rowdy.nl

Koekje d'r bij?

Thanks, die zal ik eens gaan proberen, kan ik mijn eigen kachele parser eruit wippen. ;)

En heb ik weer eens een excuus om aan mijn website te gaan werken... :+

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


Acties:
  • 0 Henk 'm!

  • Evilbee
  • Registratie: November 2002
  • Laatst online: 19:55
mithras schreef op dinsdag 02 januari 2007 @ 23:20:
/edit: ok, ik heb het toch even snel gedaan. Niet alles getest, maar volgens mij werkt het wel. Je kan het bestand hier vinden: http://download.juriansluiman.nl/ubb.class.phps
Hij werkt idd nu goed. Maar wat ik me afvraag, hoe moet je hier nou smiley's aan toevoegen?

LinkedIn - Collega worden?


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Evilbee schreef op woensdag 03 januari 2007 @ 20:16:
[...]


Hij werkt idd nu goed. Maar wat ik me afvraag, hoe moet je hier nou smiley's aan toevoegen?
Ben je misschien niet eerder geinteresseerd naar hoe stack automaten werken?
Pagina: 1