Sie sind nicht angemeldet.

oixio

Senior Schreiberling

  • »oixio« ist männlich
  • »oixio« ist der Autor dieses Themas

Beiträge: 517

Registrierungsdatum: 03.10.2004

1

10.12.2005, 14:10

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« ist männlich

Beiträge: 422

Registrierungsdatum: 08.10.2004

2

10.12.2005, 14:23

Hallo,

eigentlich sollte

Quellcode

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


als regexp ausreichen. Probier es doch einfach aus:

Quellcode

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

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »hyperion« (10.12.2005, 14:46)


oixio

Senior Schreiberling

  • »oixio« ist männlich
  • »oixio« ist der Autor dieses Themas

Beiträge: 517

Registrierungsdatum: 03.10.2004

3

10.12.2005, 16:56

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:

Quellcode

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!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »oixio« (10.12.2005, 16:57)


hyperion

Erfahrener Schreiberling

  • »hyperion« ist männlich

Beiträge: 422

Registrierungsdatum: 08.10.2004

4

10.12.2005, 17:15

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

Veränder das Pattern wie folgt:

Quellcode

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


Dann verwendest Du anstatt preg_replace preg_replace_callback:

Quellcode

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

Quellcode

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

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »hyperion« (10.12.2005, 17:48)


oixio

Senior Schreiberling

  • »oixio« ist männlich
  • »oixio« ist der Autor dieses Themas

Beiträge: 517

Registrierungsdatum: 03.10.2004

5

11.12.2005, 22:23

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


Zitat

Original von hyperion
Veränder das Pattern wie folgt:

Quellcode

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



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

Quellcode

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!