Zur Navigation

BBCode

1 tommik

Hallo,
ich habe (mal wieder) ein kleines Problem.
Und zwar habe ich einen Editor mit BBCode funktion.
Dort gibt es auch die [code*] Funktion, nur wenn man einen HTML Tag schreibt, wird dieser umgesetzt und nicht in die Ansicht vom "Code-Tag" eingetragen.

Hier mal der Code:
function codereplace($content) {
	$content=str_replace('<?','&lt;?',$content);	
  preg_match_all("/(\[code\])(.*)(\[\/code\])/", $content, $code, PREG_SET_ORDER);
  foreach($code as $teil) {
   $codestring = $teil[2];
   $codestring = ereg_replace(";)","; )",$codestring);
   $content = preg_replace("/(\[code\])(.*)(\[\/code\])/", "[CODE]Code:[HR][FONT=COURIER]".$codestring."[/FONT]
", $content,1);
}
return $content;
}
[/code]

Außerdem ....

Wenn ich alles so schreibe, dann erscheint über dem Code nochmal "Code:" :
[code*]lalala[*/code]

Wenn man es allerdings mit einem Absatz schreibt erscheint kein "Code:" über dem Code (z.B : )

[code*]
lalala
[/*code]



Danke für Antworten!

Gruß,
tommik.

19.03.2006 00:50 | geändert: 19.03.2006 00:51

2 Jörg Kruse

Hallo tommik,

wenn man einen HTML Tag schreibt, wird dieser umgesetzt und nicht in die Ansicht vom "Code-Tag" eingetragen.

Wenn du htmlspecialchars() oder htmlentities() auf $content anwendest, wird der HTML-Code ausgegeben und nicht umgesetzt

Wenn man es allerdings mit einem Absatz schreibt erscheint kein "Code:" über dem Code

Damit die Regex auch über Zeilenumbrüche wirden, wird jeweils ein Modifikator s (am Ende nach dem "/") benötigt

function codereplace($content) {
$content = htmlspecialchars($content);
 preg_match_all("/(\[code\])(.*)(\[\/code\])/s", $content, $code, PREG_SET_ORDER);
 foreach($code as $teil) {
  $codestring = $teil[2];
  $codestring = ereg_replace(";)","; )",$codestring);
  $content = preg_replace("/(\[code\])(.*)(\[\/code\])/s", "[*CODE]Code:[HR][FONT=COURIER]".$codestring."[/FONT][*/CODE]", $content,1);
 }
return $content;
}
(bei [*CODE] und [*/CODE] den Stern entfernen)

19.03.2006 11:10 | geändert: 19.03.2006 11:13

3 tommik

Hallo,
vielen Dank, der Hauptteil mit den HTML-Tags klappt nun wunderbar.
Mit dem Code: hat es zwar nicht geklappt, aber ich habe nun einfach den Codeteil entfernt ;)

Gruß,
tommik.

19.03.2006 17:40

4 C)-(iLL@

Mein Tip zur Umsetzung von BBCode, nachdem ich etliche probiert und selbst auch mit regulären Ausdrücken usw. rumgemurkst habe, ist quickerUBB, meines Erachtens der beste Code, einfach zu erweitern, genialer Aufbau. Einfach mal testen.

19.03.2006 18:08

5 tommik

Hallo,
nun taucht ein kleines Problem auf ...
Wenn man z.B & schreibt wird daraus &amp; kann das mit dem Code zu tun haben?

Gruß,
tommik.

26.03.2006 19:53

6 Jörg Kruse

Das ist auf die Codierung von htmlspecialchars() zurückzuführen - ist aber ja eigentlich gewollt, denn die HTML-Sonderzeichen sollen ja codiert werden, damit die Tags nicht ausgeführt werden. Was steht denn im HTML-Quelltext: wenn dort ein einfaches "&amp;" zu finden ist, dann sollte alles in Ordnung sein, denn dies wird ja auch nur als "&" angezeigt. Falls im HTML-Quelltext allerdings ein "&amp;amp;" steht, welches als ein "&amp;" angezeigt wird, liegt wohl eine doppelte Codierung vor...

26.03.2006 20:38 | geändert: 26.03.2006 20:41

7 tommik

Im Quellcode steht &amp;amp; ...

26.03.2006 21:53

8 Jörg Kruse

Dann wird der Code zweifach codiert - schau mal, ob die Funktion htmlspecialchars() ein weiteres Mal zur Anwendung kommt - oder eine vergleichbare Funktion wie htmlentities(). Einmal reicht ja. Allerdings wundert mich, dass vor Einfügen von htmlspecialchars() in die Funktion codereplace() der HTML-Code ausgeführt wurde?

26.03.2006 22:05

9 tommik

Nein, kommt sie nicht.
Nur das komische ist ja... Die Funktion htmlspecialchars() ist bei dem obigen Code nur für den BBCode [*code] ... Und wenn ich in unser Gästebuch z.B & schreibe wird dies gleich ersetzt, obwohl kein [*code] auftaucht.

Gruß,
tommik.

27.03.2006 13:07

10 Jörg Kruse

Ja, irgendwo muss noch eine Codierung stattgefunden haben - entweder vor der Ausgabe - oder bereits vor der Eingabe in die Datenbank. Eine der beiden besagten Funktionen müsste irgendwo im Script (inlusive Includes) noch zu finden sein; möglich wäre auch noch die Funktion get_html_translation_table()

27.03.2006 16:03