Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

1

Saturday, December 10th 2005, 2:10pm

BBCode mit PHP

Hallo,

ich habe folgendes Problem:

ich will auf meiner Seite so eine Art Tippdatenbank für mich selbst machen. Da es nicht sooo viele Tipps sein werden mache ich das ganze Textbasiert (das ist für mich ausreichend - ne Datenbank wäre overkill)

Nun will ich in dem Tipptext selbst zur normalen Formatierung HTML-Tags zulassen (wie gesagt ist ja nur für mich und außerdem passwortgeschützt - also keine Spamgefahr). Nur möchte evtl wenns zB nen Tipp zu HTML ist auch HTML-Quelltext anzeigen können - und zwar ohne ihn per hand durch die HTML-Zeichen wie <, > zu codieren.

Diese Teile möchte ich beim eingeben (und auch so abspeichern) mit ner Art BBCode (wie auch hier im Forum) codieren, also den Teil zwischen [ code ] und [ /code ] setzen.(edit - natürlich ohne die Leerzeichen in den eckigen Klammern - aber sonst macht er hier auch nen Codeblock draus)

Wenn ich also einen Tipp anzeigen will, der beispielsweise in der Variable $x als String drinsteht, müsste ich alle vorkommen von [ code ][ /code ] suchen, diese durch <div id="code"> </div> ersetzten (das ginge ja noch einfach mit "str_replace") - und dann den davon eingeschlossenen Teil mit "htmlentities" in die entsprechenden HTML-Zeichen codiert zum anzeigen.

Verschachtelte Elemente soll es also nicht geben, wohl aber mehre code-Blöcke im Text.

Ich hab jetzt schon mal en bischen mit Regulären Ausdrücken rumgespielt - aber so wirklich komm ich damit noch nicht zum Ziel, bzw ich weiss noch nicht genau wie ich das ersetzen dann in PHP bewerkstellen kann.

Zusammengebastelt hab ich mit bis jetzt folgenden Ausdruck:

(\[code\])(.*?)(\[\/code\])

blos wenn ich das hier (Online RegExp-Auswertung) ausprobiere, dann markiert er mir immer beide code-Blöcke gleichzeitig.

Kann mir da wer weiterhelfen? Oder gibt es eine einfachere Möglichkeit?


Gruß,

oixio
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

hyperion

Erfahrener Schreiberling

  • "hyperion" is male

Posts: 422

Date of registration: Oct 8th 2004

2

Saturday, December 10th 2005, 2:23pm

Hallo,

eigentlich sollte

Source code

1
/\[code\](.*?)\[\/code\]/


als regexp ausreichen. Probier es doch einfach aus:

Source code

1
2
3
4
5
6
<?php
$test = "[i]italic[/i]";
$i_regexp = "#\[i\](.*?)\[/i\]#";

print preg_replace($i_regexp, "<em>$1</em>", $test);
?>


Sollte eigentlich so gehen.

EDIT:

Habe mir Dein Problem mit dem Online Ding angesehen. Das ist schon richtig so, wie es funktioniert. Du sagst mit Deinem Pattern, dass Du alles haben willst, von code, dann den text und noch mal den code.

Dann kannst Du durch preg_replace Dir die Gruppe in der Mitte nehmen und durch den äquivalente HTML-Tag ersetzen.
"Der Klügere gibt nach! Eine traurige Wahrheit, sie begründet die Weltherrschaft der Dummheit." --Marie von Ebner-Eschenbach

This post has been edited 3 times, last edit by "hyperion" (Dec 10th 2005, 2:46pm)


oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

3

Saturday, December 10th 2005, 4:56pm

Hallo,

danke erstmal - das funktioniert auf jeden fall schonmal soweit. Nur leider ersetzt es mir nur den ersten Teil - falls ich zwei code-Blöcke habe wird mir nur einer ersetzt.

Beispiel:

Source code

1
2
3
4
5
6
7
8
9
gsegsdfgsdfgsd sdfhg dsh gh fgh dfghs hsfghsf ghshgh sg hsghsgh sfhgsfg hsfgh sfgh sfggggggggggggggggggggg
[ code ]Dies soll aussehen wie code - und tut sie auch[ /code ]
fgsdfgsdf
g
[ code ]und das hier?[ /code ]
sdfgsdfg
sdfg
sdfg
dsfg


und 2. - wie wende ich jetzt beim Ersetzen htmlentities() auf den inneren Teil an?

Gruß,

oixio

edit: wieder die leerzeichen im [ code ]
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

This post has been edited 1 times, last edit by "oixio" (Dec 10th 2005, 4:57pm)


hyperion

Erfahrener Schreiberling

  • "hyperion" is male

Posts: 422

Date of registration: Oct 8th 2004

4

Saturday, December 10th 2005, 5:15pm

Der zweite Teil wird nicht gefunden, da das Pattern nicht über \n matcht.

Veränder das Pattern wie folgt:

Source code

1
#\[(\w+)\]((.|\n)*?)\[/\\\1\]#


Dann verwendest Du anstatt preg_replace preg_replace_callback:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$text = "dies ist ein schöner test. mit [b]bold[/b] und [i]italic[/i].";
$pattern = "#\[(\w+)\]((.|\n)*?)\[/\\\1\]#";  // wir wollen nur i_text_i und nicht i_text_b

print preg_replace_callback($pattern, "_htmlentities", $text);

function _htmlentities ($match) {
  if($match[1] == "i")
    return "<em>".$match[2]."</em>";
  elseif($match[1] == "b")
    return "<strong>".$match[2]."</strong>";
  else
    return $match[2];
}
?>


Ist natürlich nur eine Beispielfunktion. Kann noch stark verbessert werden ($match[0] ist immer der ganze gematchte String, die anderen jeweils die RegExp Gruppen).

Viel Spass.

EDIT:
Dadurch kannst Du Deine Tags auch schachteln

Source code

1
Netter [b][i]Text[/i] zum testen[/b].

funktioniert auch

Netter Text zum testen.
"Der Klügere gibt nach! Eine traurige Wahrheit, sie begründet die Weltherrschaft der Dummheit." --Marie von Ebner-Eschenbach

This post has been edited 4 times, last edit by "hyperion" (Dec 10th 2005, 5:48pm)


oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

5

Sunday, December 11th 2005, 10:23pm

Sorry, dass ich mich jetzt erst wiedermelde. Aber stand ne Familienfeier an :rolleyes:


Quoted

Original von hyperion
Veränder das Pattern wie folgt:

Source code

1
#\[(\w+)\]((.|\n)*?)\[/\\\1\]#



Das hat bei mir erst funktioniert als ich es wie folgt geändert hab:

Source code

1
#\[(\w+)\]((.|\n)*?)\[/\\1\]#
also vor der 1 nur zwei "\".

Das mit ersetzen und so weiter funktioniert dann auch so wie ich mir das vorgestellt hab. Danke schonmal dafür.

Nur ist mir beim Testen eben noch eine Kleinigkeit aufgefallen:

Wenn ich einen Verschachtelten Block gleicher Elemente hab (z.B. [ code ] sfdlhs [ code ] asfgkjfh [ /code ] frgskidh [ /code] ) dann findet das Pattern folgenden Teil:
[ code ] sfdlhs [ code ] asfgkjfh [ /code ] frgskidh [ /code] .

So wie ich es aber gerne hätte, sollte es aber nur die äußeren beachten. Verschachteln muss nicht unbedingt möglich sein - es muss das Beispiel oben aber korrekt erkennen.

Aber besten Dank schonmal,

oixio
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!