bbcodes

21.12.2006

wer ein gästebuch betreibt der wird sicher festgestellt haben, dass es niht besonders sinnvoll ist, es den besuchern zu gestatten html zu verwenden. das kann unschöne nebeneffekte haben und das design "zeschiessen". besser ist da die verwendung von sogenannten bbcodes, die vor allem aus foren bekannt sind. dabei werden nur einige wenige tags erlaubt, die die seite nicht kaputtmachen. ich war selbst einige zeit auf der suche nach einer solchen funktion, die auch standardkonformen code produziert. der den ish schliesslich bei flitze ist schon ganz gut, ich habe ihn noch ein bischen getunt.

im folgenden stelle ich kurz die funktionen vor, die ich zum einbinden dieser bbcodes verwende. dabei konnte ich große teile aus dem tutorial von flitze verwenden, auf entsprechende passagen werde ich deshalb nicht näher eingehen.

zunächst habe ich einige zusatzfunktionen eingebaut, wie zum beispiel eine antispam funktion, die emailadressen automatisch so umwandelt, dass sie von bots nicht erkannt werden.

zur mailfunktion:
1
2
3
4
5
6
7
8
9
10
11
12
<?
function no_spam($mail) {
    
$str "";
    
$a unpack("C*"$mail[1]);
    foreach (
$a as $b)
      
$str .= sprintf("%%%X"$b);
      
$mail[1] = str_replace("."" dot "$mail[1]);
      
$link str_replace("@"" bei "$mail[1]);

    return 
"<a href="mailto:".$str."">".$link."</a>";
}
?>



diese funktion gibt anstatt der "echten" emailadresse automatisch einen link wie diesen aus: fishnation bei gmx dot de .

php stellt zwar von sich aus eine funktion zum einfärben von php zu verfügung, ich möchte allerdings auch noch zeilennummern neben dem text darstellen. die tut die folgende funktion.

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
<?php
//stellt den php code farbig dar
function SyntaxHighlight($text) {
    
$code highlight_string$texttrue );

//ab hier nur für versionen < php4 notwendig
    
$code str_replace('<font color="#FF9900">''<span class="comment">'$code);
    
$code str_replace('<font color="#0000CC">''<span class="default">'$code);
    
$code str_replace('<font color="#000000">''<span class="html">'$code);
    
$code str_replace('<font color="#006600">''<span class="keyword">'$code);
    
$code str_replace('<font color="#CC0000">''<span class="string">'$code);
    
$code str_replace('</font>''</span>'$code);
//bis hier nur für versionen < php4 notwendig

//die links zum php-handbuch erstellen
     
$code preg_replace'{([\w]+)(\s*</span><span\s+class="keyword">|)(\s*\()}',
            
'<a class="keyword_link" title="PHP Handbuch zu  Ã¶ffnen" href="http://www.php.net/"></a>'$code );
    
$arrHTML explode"<br />"$code );
    
$count count$arrHTML );

//html anfang
    
$html .= "<div class=\"php\">";
    
$html .= "<div class=\"zeilen\">\n";

//zeilennummern einsetzen
    
for$i 1$i <= $count$i++ ) {
        
$html .= $i."<br />\n";
    }

    
$html .= "</div><div class=\"code\">\n";

//code lines...
    
foreach$arrHTML as $line ) {
        
$html .= $line."<br />\n";
    }
//html ende
    
$html .= "</div></div>\n";

    return 
$html;
}



die gesamte datei mit allen wichtigen funktionen sieht dann aus, wie im folgenden dargestellt. auf einiges sollte man beim einbinden achten: in zeile 103 ist der tag richtig zu schriben, also [php] statt [ php] und [/php] statt [ /php]. ausserdem müssen die klassen span.comment, span.default, span.html, span.keyword, span.string, und a.keyword_link definiert werden, damit der code auf bunt angezeigt wird. wenn fette zeichen verwendet werden, so sollten deren schriftart 1px kleiner als der rest sein, damit die zeilennummern stimmen.

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
<?php
//stellt den php code farbig dar
function SyntaxHighlight($text) {
    
$code highlight_string$texttrue );

//ab hier nur für versionen < php4 notwendig
    
$code str_replace('<font color="#FF9900">''<span class="comment">'$code);
    
$code str_replace('<font color="#0000CC">''<span class="default">'$code);
    
$code str_replace('<font color="#000000">''<span class="html">'$code);
    
$code str_replace('<font color="#006600">''<span class="keyword">'$code);
    
$code str_replace('<font color="#CC0000">''<span class="string">'$code);
    
$code str_replace('</font>''</span>'$code);
//bis hier nur für versionen < php4 notwendig

//die links zum php-handbuch erstellen
     
$code preg_replace'{([\w]+)(\s*</span><span\s+class="keyword">|)(\s*\()}',
            
'<a class="keyword_link" title="PHP Handbuch zu  Ã¶ffnen" href="http://www.php.net/"></a>'$code );
    
$arrHTML explode"<br />"$code );
    
$count count$arrHTML );

//html anfang
    
$html .= "<div class=\"php\">";
    
$html .= "<div class=\"zeilen\">\n";

//zeilennummern einsetzen
    
for$i 1$i <= $count$i++ ) {
        
$html .= $i."<br />\n";
    }

    
$html .= "</div><div class=\"code\">\n";

//code lines...
    
foreach$arrHTML as $line ) {
        
$html .= $line."<br />\n";
    }
//html ende
    
$html .= "</div></div>\n";

    return 
$html;
}

// Prüft die Linklänge und passt sie gegebenenfalls an
function linkLenght($treffer) {
// $treffer[1] ist die URL
        
$url trim($treffer[1]);

// $treffer[2] ist der Ausgabename
// wurde kein Name angegeben, wird die URL als Name gewählt
        
if(strlen(trim($treffer[2]))!=0) {
            
$linkname $treffer[2];
        }
        else {
            
$linkname $treffer[1];
        }
// legt eine maximale Länge von 50 Zeichen fest
// Ausnahme bei [img]-Tags
        
if(strlen($linkname)>50 AND !substr_count(strtolower($linkname), '[img]') AND !substr_count(strtolower($linkname), '[/img]')) {
            
$linkname substr($linkname045-3)."...".substr($linkname, -5);
        }
// Rückgabelink
        
$ergebnis "<a href=\"".$url."\">".$linkname."</a>";
        return 
$ergebnis;
}

function 
no_spam($mail) {
    
$str "";
    
$a unpack("C*"$mail[1]);
    foreach (
$a as $b)
      
$str .= sprintf("%%%X"$b);
      
$mail[1] = str_replace("."" dot "$mail[1]);
      
$link str_replace("@"" bei "$mail[1]);

    return 
"<a href=\"mailto:".$str."\">".$link."</a>";
}

function 
parseVar($treffer) {
// $treffer[1] ist die Variable zwischen den [var]-Tags
    
$str $treffer[1];
// Klammer in grün hervorheben
    
$str str_replace("[""<span style=\"color:#007700\">[</span>"$str);
    
$str str_replace("]""<span style=\"color:#007700\">]</span>"$str);
// alles was zwischen single quotes ( ') steht rot hervorheben
    
$str preg_replace("/(&#039;.*&#039;)/Uis""<span style=\"color:#DD0000\"></span>"$str);
// den Rest blau hervorheben
    
$str "<span style=\"color:#0000BB\">".$str."</span>";
    return 
$str;
}

function 
bbcodes ($text) {
//konfiguration

//php-code
    
$php array();
    
$der_code array();

// PHP Code zwischenspeichern, damit er nicht durch andere Funktionen (z.B. nl2br) verfälscht wird
    
preg_match_all("/\[php\](.*)\[\/php\]/siU"$text$php);
// PHP Code zwischenspeichern, damit er nicht durch andere Funktionen (z.B. nl2br) verfälscht wird
    
preg_match_all("/\[code\](.*)\[\/code\]/siU"$text$der_code);

    foreach(
$php[0] as $key => $value){
// Im Text durch eine Variable ersetzen, um diese dann später wiederum durch den Code zu ersetzen
        
$text=preg_replace('#'.preg_quote($value'#').'#','[ php]'.$key.'[/ php]',$text,1);

// Code highlighten
        
$php[1][$key] = SyntaxHighlight($php[1][$key], TRUE);
    }

    foreach(
$der_code[0] as $key => $value){

// Im Text durch eine Variable ersetzen, um diese dann später wiederum durch den Code zu ersetzen
        
$text=preg_replace('~'.preg_quote($value'~').'~','[code]'.$key.'[/code]',$text,1);

// Code highlighten
        
$der_code[1][$key] = SyntaxHighlight($php[1][$key], TRUE);
    }

// Wörter mit mehr als 60 Zeichen werden ab dem 60. Zeichen um ein Leerzeichen ergänzt
// damit der Browser den Text umbrechen kann (, sonst wird das Layout zerstört)
    
$max_word_lenght 60;

// Die Länge von Links ist größer, da sie nur im Quelltext als 'lang' erscheinen
// Links werden später noch gesondert behandelt
    
$max_link_lenght 200;

// Trennzeichen
    
$splitter " ";

// Text in Zeilen aufteilen, sonst würden Zeilenumbrüche (\n) nicht als Worttrennung erkannt
    
$lines explode("\n"$text);

//links kürzen
    
foreach($lines as $key_line => $line) {
// jede Zeile in Wörter aufteilen
        
$words explode(" ",$line);

// jedes Wort prüfen
        
foreach($words as $key_word => $word) {

// für Links wird die maximale Länge erhöht
            
if(substr(strtolower($word), 07)== 'http://' OR substr(strtolower($word), 08)== 'https://' OR substr(strtolower($word), 04)=='www.') {
                
$max_lenght $max_link_lenght;
            }

            else {
                
$max_lenght $max_word_lenght;
            }

            
$word trim($word);

// BB-Code Tags entfernen, da sie nicht zur Buchstabenlänge eines Wortes zählen
            
$word preg_replace("/\[(.*)\]/Usi"""$word);

            if(
strlen($word)>$max_lenght) {
// Trennen des Wortes nach max_length Buchstaben
                
$words[$key_word] = chunk_split($words[$key_word], $max_lenght$splitter);

// abziehen der Länge des Trennzeichens, dieses wird am Ende automatisch
// noch einmal eingefügt
                
$length strlen($words[$key_word])-strlen($splitter);
                
$words[$key_word] = substr($words[$key_word],0,$length);
            }
        }

// fügt die veränderten Wörter wieder zur Zeile als String zusammen
        
$lines[$key_line] = implode(" "$words);
    }

// fügt Zeilen wieder zum gesamten Text als String zusammen
    
$text implode("\n"$lines);

//email
    
$text preg_replace_callback('"([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,6})"si''no_spam'$text);

//url-umwandlung
    
$text preg_replace_callback("/\[url=(.*)\](.*)\[\/url\]/Usi"'linkLenght'$text);
    
$text preg_replace_callback('#(( |^)(((ftp|http|https|)://)|www.)\S+)#mi''linkLenght'$text);
//text formatieren darstellen
    
$text preg_replace("/\[b\](.*)\[\/b\]/Usi""<span style=\"font-weight: bold;\">\1</span>"$text);
    
$text preg_replace("/\[i\](.*)\[\/i\]/Usi""<span style=\"font-style: italic;\">\1</span>"$text);
    
$text preg_replace("/\[u\](.*)\[\/u\]/Usi""<span style=\"text-decoration: underline;\">\1</span>"$text);
    
$text preg_replace("/\[color=(.*)\](.*)\[\/color\]/Usi""<span style=\"color:\1\">\2</span>"$text);
    
$text preg_replace("/\[umfluss=(.*)\](.*)\[\/umfluss\]/Usi""<span class=\"\1\">\2</span>"$text);
    
$text preg_replace("/\[video\](.*)\[\/video\]/Usi""<object type=\"application/x-shockwave-flash\" style=\"width:250px; height:205px\" data=\"\1\"><param name=\"movie\" value=\"\1\" /></object>"$text);
    
$text preg_replace("/\[img=(.*)\](.*)\[\/img\]/Usi""<img src=\"\1\" alt=\"\2\" />"$text);
    
$text preg_replace("/\[img](.*)\[\/img\]/Usi""<img src=\"\1\" alt=\"nicht bennantes bild\" />"$text);
    
$text preg_replace("/\[h1\](.*?)\[\/h1\]/si",  "<h1>\1</h1>"$text);
    
$text preg_replace("/\[h2\](.*?)\[\/h2\]/si",  "<h2>\1</h2>"$text);

//php-variablen hervorheben
    
$text preg_replace_callback("/\[var\](.*)\[\/var\]/Usi"'parseVar'$text);

// Zitate umwandeln, evtl. auch verschachtelt
//breite des zitatkastens in pixeln
    
$width 420;
    while(
preg_match('/\[quote\](.*)\[\/quote\]/Uis'$text)) {
        
$width -= 10;
        
$quote_start "<div class=\"zitat\" style=\"width:".$width."px\">";
        
$quote_end "</div>";
        
$text preg_replace("/\[quote](.*)\[\/quote\]/Uis"$quote_start."\1".$quote_end$text);
    }
//die smilies einbinden
$smilie_pfad "images/smilies/";

$smilies array(
    
':D' => array('biggrin.gif''*grins*'),
    
':)' => array('biggrin.gif''*grins*'),
    
':-D' => array('biggrin.gif''*grins*'),
    
'0:-)' => array('angel.gif''engel'),
    
'08-D' => array('angel.gif''engel'),
    
':angel:' => array('angel.gif''engel'),
    
':-H' => array('angry.gif''*verärgert*'),
    
':H' => array('angry.gif''*verärgert*'),
    
':-@' => array('angry.gif''*verärgert*'),
    
':angry:' => array('angry.gif''*verärgert*'),
    
':-]' => array('approve.gif''*zustimmung*'),
    
':]' => array('approve.gif''*zustimmung*'),
    
':approve:' => array('approve.gif''*zustimmung*'),
    
':argh:' => array('arg.gif''*argh*'),
    
':artist:' => array('artist.gif''kuenstler'),
    
':asian:' => array('asian.gif''asiate'),
    
':baby:' => array('baby.gif''baby'),
    
':bandit:' => array('bandit.gif''bandit'),
    
'*_o' => array('blackeye.gif''black eye'),
    
'o_+' => array('blackeye.gif''black eye'),
    
'+_o' => array('blackeye.gif''black eye'),
    
'o_*' => array('blackeye.gif''black eye'),
    
':blackeye:' => array('blackeye.gif''black eye'),
    
'+_o' => array('blackeye.gif''black eye'),
    
':bunny:' => array('bunny.gif''bunny'),
    
':chinese:' => array('chinese.gif''chinese'),
    
':classic:' => array('classic.gif''*smile*'),
    
'+_+' => array('clown.gif''clown'),
    
':clown:' => array('clown.gif''clown'),
    
'?(' => array('confused.gif''verwirrt'),
    
':confused:' => array('confused.gif''verwirrt'),
    
'8-)' => array('cool.gif''*cool*'),
    
'8-D' => array('cool.gif''*cool*'),
    
'8)' => array('cool.gif''*cool*'),
    
'8D' => array('cool.gif''*cool*'),
    
':cool:' => array('cool.gif''*cool*'),
    
':\'(' => array('cry.gif''*schnief*'),
    
':cry:' => array('cry.gif''*schnief*'),
    
':dead:' => array('dead.gif''tot'),
    
':I' => array('devious.gif''böse'),
    
':i' => array('devious.gif''böse'),
    
':boese:' => array('devious.gif''böse'),
    
'/-(' => array('disappointed.gif''enttäuscht'),
    
':disappointed:' => array('disappointed.gif''enttäuscht'),
    
':augendreh:' => array('dizzy.gif''*augendreh*'),
    
':dude:' => array('dude.gif''dude'),
    
':-o' => array('eek.gif''*o*'),
    
':-0' => array('eek.gif''*o*'),
    
':-O' => array('eek.gif''*o*'),
    
':O' => array('eek.gif''*o*'),
    
':0' => array('eek.gif''*o*'),
    
':evil:' => array('evil.gif''*böse*'),
    
':gangsta:' => array('gangsta.gif''gangsta'),
    
'$-)' => array('greedy.gif''$$$$$'),
    
'$_$' => array('greedy.gif''$$$$$'),
    
':$$$:' => array('greedy.gif''$$$$$'),
    
':-*' => array('kiss.gif''*kuss*'),
    
':kiss:' => array('kiss.gif''*kuss*'),
    
':~/' => array('knocked-out.gif''*knocked-out*'),
    
':knocked-out:' => array('knocked-out.gif''*knocked-out*'),
    
'LOL' => array('lol.gif''LOL'),
    
':lol:' => array('lol.gif''LOL'),
    
':schiel:' => array('lurk.gif''*schiel*'),
    
':oger:' => array('oger.gif''oger'),
    
':altermann:' => array('oldman.gif''alter mann'),
    
':besserweis:' => array('redface.gif''*besserwiss*'),
    
'z-(' => array('pirate.gif''pirat'),
    
':roboter:' => array('robot.gif''robot'),
    
':rolleyes:' => array('rolleyes.gif''*augenroll*'),
    
':-(' => array('sad.gif''*traurig*'),
    
':(' => array('sad.gif''*traurig*'),
    
':schaem:' => array('shame.gif''*schäm*'),
    
':-p' => array('tongue.gif''*zungeraus*'),
    
';-p' => array('tongue.gif''*zungeraus*'),
    
':-P' => array('tongue.gif''*zungeraus*'),
    
';-P' => array('tongue.gif''*zungeraus*'),
    
':-S' => array('sick.gif''*krank*'),
    
':S' => array('sick.gif''*krank*'),
    
':krank:' => array('sick.gif''*krank*'),
    
':-Z' => array('sleeping.gif''*schlaf*'),
    
':-z' => array('sleeping.gif''*schlaf*'),
    
':schlaf:' => array('sleeping.gif''*schlaf*'),
    
':smart:' => array('smart.gif''*smart*'),
    
'o_o' => array('square-eyed.gif''viereckige augen'),
    
';-)' => array('wink.gif''*zwinker*'),
    
';)' => array('wink.gif''*zwinker*'),
    
':zwinker:' => array('wink.gif''*zwinker*'),
    
':-|' => array('worried.gif''*besorgt*'),
    
':|' => array('worried.gif''*besorgt*'),
    
':-X' => array('x-face.gif''*nixsag*'),
    
':nixsag:' => array('x-face.gif''*nixsag*')
);

foreach (
$smilies as $find => $replace) {
    list(
$img$title) = $replace;
    
$replace '<img src="'.$smilie_pfad.''.$img.'" alt="'
        
.$find.'" title="'.$title.'"/>';
    
$text str_replace($find$replace$text);
}


//aus umbrüchen <br> machen
    
$text nl2br($text);

//PHP Code wieder einfügen
    
foreach($php[1] as $key => $value) {
        
$text preg_replace("/\[php\]".$key."\[\/php\]/siU"$value$text);
    }

    foreach(
$der_code[1] as $key => $value) {
        
$text preg_replace("/\[code\]".$key."\[\/code\]/siU"$value$text);
    }

    return 
$text;
}
?>



viel spass beim verwenden!

kommentar schreiben



mensch oder maschine? den code bitte in das eingabefeld eintragen. danke.


smilies
permalink
zurück zur übersicht