Ergebnis 1 bis 9 von 9

Thema: BB-Code: Nicht HTML-konforme Verschachtelung lösen

  1. #1
    Teeny
    Registriert seit
    13.01.2006
    Beiträge
    39
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard BB-Code: Nicht HTML-konforme Verschachtelung lösen

    Ich arbeite gerade an einem BB-Code-Parser. Ich verwende dabei unter anderem folgende BB-Codes:
    Code:
    [b] für fett
    [i] für kursiv
    [u] für unterstrichen
    [left] für einen linksbündigen Absatz
    [center] für einen zentrierten Absatz
    [right] für einen rechtsbündigen Absatz
    [indent] für einen eingerückten Absatz
    [quote] für ein Zitat
    Damit beim Parsen kein ungültiges HTML erzeugt wird, muss der gesamte Text vor dem Parsen so verändert werden, dass wenn [b],[i] oder [u] einen absatzerzeugenden Code umklammern, [b],[i] oder [u] vor dem Absatz geschlossen werden, nach öffnen des Absatzes wieder geöffnet werden, am Ende des Absatzes wieder geschlossen werden und dann nach dem Absatz wieder geöffnet werden. Wenn ein Absatz also z.B. fett dargestellt werden soll, dürfen die b-Tags nicht außerhalb des Tags, der den Absatz erzeugt, stehen, sondern müssen davor geschlossen werden und dann innerhalb des Absatzes wieder geöffnet werden.

    Ein einfaches Beispiel wäre:
    Code:
    [b]Text1[center]Text2[/center]Text3[/b]
    Soll werden zu...
    Code:
    [b]Text1[/b][center][b]Text2[/b][/center][b]Text3[/b]
    Das ganze sollte aber auch im folgenden Fall funktionieren:
    Code:
    [b]Text1[i]Text2[u]Text3[center]Text4[/center]
    Text5[/i]Text6[right]Text7[/right]Text8[/b]Text9[/u]
    Soll werden zu...
    Code:
    [b]Text1[i]Text2[u]Text3[/u][/i][/b][center][b][i][u]Text4[/u][/i][/b][/center]
    [b][u][i]Text5[/i]Text6[/u][/b][right][b][u]Text6[/u][/b][/right][u][b]Text8[/b]Text9[/u]
    Ich habe den Parser eigentlich bereits vollständig fertig. Mir fehlt eben nur noch eine Funktion, die den Text wie oben angegeben umformt. Ich habe recht lange mit preg_replace herumexperimentiert, bin jedoch nicht zu einem zufrieden stellenden Ergebnis gekommen. Es wäre also toll, wenn jemand eine Idee hätte, wie man das Problem lösen kann oder vielleicht jemand weiß, wie das bei anderen Parsern gemacht ist. Vielen Dank bereits im Voraus,
    Daniel
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Forum Guru
    Registriert seit
    28.12.2004
    Ort
    Ringgenberg(bei Interlaken) / Schweiz
    Beiträge
    4.787
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Code:
    function bbencode($message) {
    	// [code] and [/code] for posting code (HTML, PHP, C etc etc) in your posts.
    	$matchCount = preg_match_all("#\[code\](.*?)\[/code\]#si", $message, $matches);
    
    	for &#40;$i = 0; $i < $matchCount; $i++&#41;
    	&#123;
    		$currMatchTextBefore = preg_quote&#40;$matches&#91;1&#93;&#91;$i&#93;&#41;;
    		$currMatchTextAfter = htmlspecialchars&#40;$matches&#91;1&#93;&#91;$i&#93;&#41;;
    		$message = preg_replace&#40;"#\&#91;code\&#93;$currMatchTextBefore\&#91;/code\&#93;#si", "<TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD>Code&#58;<HR></TD></TR><TR><TD><PRE>$currMatchTextAfter</PRE></TD></TR><TR><TD><HR></TD></TR></TABLE>", $message&#41;;
    	&#125;
    
    	// &#91;QUOTE&#93; and &#91;/QUOTE&#93; for posting replies with quote, or just for quoting stuff.
    	$message = preg_replace&#40;"#\&#91;quote\&#93;&#40;.*?&#41;\&#91;/quote&#93;#si", "<TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD>Quote&#58;<HR></TD></TR><TR><TD><BLOCKQUOTE>\\1</BLOCKQUOTE></TD></TR><TR><TD><HR></TD></TR></TABLE>", $message&#41;;
    
    	// &#91;b&#93; and &#91;/b&#93; for bolding text.
    	$message = preg_replace&#40;"#\&#91;b\&#93;&#40;.*?&#41;\&#91;/b\&#93;#si", "\\1", $message&#41;;
    
    	// &#91;i&#93; and &#91;/i&#93; for italicizing text.
    	$message = preg_replace&#40;"#\&#91;i\&#93;&#40;.*?&#41;\&#91;/i\&#93;#si", "\\1", $message&#41;;
    
    	// &#91;u&#93; and &#91;/u&#93; for italicizing text.
    	$message = preg_replace&#40;"#\&#91;u\&#93;&#40;.*?&#41;\&#91;/u\&#93;#si", "<U>\\1</U>", $message&#41;;
    	// &#91;url&#93;www.phpbb.com&#91;/url&#93; code..
    	$message = preg_replace&#40;"#\&#91;url\&#93;&#40;http&#58;//&#41;?&#40;.*?&#41;\&#91;/url\&#93;#si", "<A HREF=\"http&#58;//\\2\" TARGET=\"_blank\">\\2</A>", $message&#41;;
    
    	// &#91;url=www.phpbb.com&#93;phpBB&#91;/url&#93; code..
    	$message = preg_replace&#40;"#\&#91;url=&#40;http&#58;//&#41;?&#40;.*?&#41;\&#93;&#40;.*?&#41;\&#91;/url\&#93;#si", "<A HREF=\"http&#58;//\\2\" TARGET=\"_blank\">\\3</A>", $message&#41;;
    
    	// &#91;email&#93;user@domain.tld&#91;/email&#93; code..
    	$message = preg_replace&#40;"#\&#91;email\&#93;&#40;.*?&#41;\&#91;/email\&#93;#si", "<A HREF=\"mailto&#58;\\1\">\\1</A>", $message&#41;;
    
    	// &#91;img&#93;image_url_here&#91;/img&#93; code..
    	$message = preg_replace&#40;"#\&#91;img\&#93;&#40;http&#58;//&#41;?&#40;.*?&#41;\&#91;/img\&#93;#si", "<IMG SRC=\"http&#58;//\\2\">", $message&#41;;
    	// $message = preg_replace&#40;"#\&#91;img\&#93;&#40;.*?&#41;\&#91;/img\&#93;#si", "<IMG SRC=\"\\1\">", $message&#41;;
    
    
    	// unordered list code..
    	$matchCount = preg_match_all&#40;"#\&#91;list\&#93;&#40;.*?&#41;\&#91;/list\&#93;#si", $message, $matches&#41;;
    
    	for &#40;$i = 0; $i < $matchCount; $i++&#41;
    	&#123;
    		$currMatchTextBefore = preg_quote&#40;$matches&#91;1&#93;&#91;$i&#93;&#41;;
    		$currMatchTextAfter = preg_replace&#40;"#\&#91;\*\&#93;#si", "<LI>", $matches&#91;1&#93;&#91;$i&#93;&#41;;
    
    		$message = preg_replace&#40;"#\&#91;list\&#93;$currMatchTextBefore\&#91;/list\&#93;#si", "<UL>$currMatchTextAfter[/list]", $message&#41;;
    	&#125;
    
    	// ordered list code..
    	$matchCount = preg_match_all&#40;"#\&#91;list=&#40;&#91;aA1I&#93;&#41;\&#93;&#40;.*?&#41;\&#91;/list\&#93;#si", $message, $matches&#41;;
    
    	for &#40;$i = 0; $i < $matchCount; $i++&#41;
    	&#123;
    		$currMatchTextBefore = preg_quote&#40;$matches&#91;2&#93;&#91;$i&#93;&#41;;
    		$currMatchTextAfter = preg_replace&#40;"#\&#91;\*\&#93;#si", "<LI>", $matches&#91;2&#93;&#91;$i&#93;&#41;;
    
    		$message = preg_replace&#40;"#\&#91;list=&#40;&#91;aA1I&#93;&#41;\&#93;$currMatchTextBefore\&#91;/list\&#93;#si", "
    1. $currMatchTextAfter
    ", $message&#41;; &#125; // alle \n durch ein BR ersetzen &#40;Zeilensprung&#41; $message = str_replace&#40;"\n", "<BR \>\n", $message&#41;; return&#40;$message&#41;; &#125;

    ist zwar etwas overkilled das ganze aber geht.

  3. #3
    Teeny
    Themenstarter

    Registriert seit
    13.01.2006
    Beiträge
    39
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Also erstmal vielen Dank für deine Hilfe. Aber ich glaube die Funktion löst mein Problem nicht. Einen BB-Code Parser habe ich ja bereits. Das einzige was mir noch fehlt ist eben eine Funktion, die vor dem eigentlichen Parsen die Formatierungsbefehle wie b,i und u korigiert, so dass z.B. aus...
    Code:
    &#91;b&#93;Text1&#91;i&#93;Text2&#91;u&#93;Text3&#91;center&#93;Text4&#91;/center&#93;
    Text5&#91;/i&#93;Text6&#91;right&#93;Text7&#91;/right&#93;Text8&#91;/b&#93;Text9&#91;/u&#93;
    ... folgendes wird:
    Code:
    &#91;b&#93;Text1&#91;i&#93;Text2&#91;u&#93;Text3&#91;/u&#93;&#91;/i&#93;&#91;/b&#93;&#91;center&#93;&#91;b&#93;&#91;i&#93;&#91;u&#93;Text4&#91;/u&#93;&#91;/i&#93;&#91;/b&#93;&#91;/center&#93;
    &#91;b&#93;&#91;u&#93;&#91;i&#93;Text5&#91;/i&#93;Text6&#91;/u&#93;&#91;/b&#93;&#91;right&#93;&#91;b&#93;&#91;u&#93;Text6&#91;/u&#93;&#91;/b&#93;&#91;/right&#93;&#91;u&#93;&#91;b&#93;Text8&#91;/b&#93;Text9&#91;/u&#93;
    Aber wie macht man so was?

  4. #4
    Forum Guru
    Registriert seit
    28.12.2004
    Ort
    Ringgenberg(bei Interlaken) / Schweiz
    Beiträge
    4.787
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    aso kommen wir erstmal zur preisfrage was diese ganze aktion soll.

    also das einzigste was du beachten musst, das alle geöffneten tags geschlossen werden müssen bevor man ein anderes öffnest.

    und das macht man eigentlich schon mit dem script welches den bbcode erstellt.

    da das ganze wie du es dir denkst viel viel zu aufwendig währe um es bei jedem anzeigen durchlaufen zu lassen.

  5. #5
    Teeny
    Themenstarter

    Registriert seit
    13.01.2006
    Beiträge
    39
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Also das ganze ist so:
    Ich arbeite an einem Skript, dass den BB-Code zu HTML-Code umformt. Ich habe mir dafür folgenden Parser geholt http://www.christian-seiler.de/proje...ode/index.html.

    Das Problem was ich jetzt habe, ist dass wenn jemand z.B.
    Code:
    &#91;b&#93;&#91;center&#93;Hallo&#91;/center&#93;&#91;/b&#93;
    eintippt, das zu folgendem wird:
    Code:
    <p style="text-align&#58;center">Hallo</p>
    Das wäre aber kein gültiges HTML und würde bei komplizierteren Texten dazu führen, dass der Code auch nicht wie gedacht interpretiert wird. Deshalb brauche ich eine Funktion, die vor dem eigentlichen Parsen den Code entsprechend umformt. Bei obigen Beispiel würde das dann so aussehen:
    Code:
    &#91;b&#93;&#91;/b&#93;&#91;center&#93;&#91;b&#93;Hallo&#91;/b&#93;&#91;/center&#93;&#91;b&#93;&#91;/b&#93;
    Die leeren Tags würden dann von einer anderen Funktion später gelöscht. Ich habe auch bereits eine Funktion geschrieben, die obiges Beispiel richtig umsetzt. Mein Problem ist aber, dass dann aus...
    Code:
    &#91;b&#93;&#91;center&#93;Text1&#91;/center&#93;&#91;right&#93;Text2&#91;/right&#93;&#91;/b&#93;
    ... letztendlich folgendes wird:
    Code:
    &#91;center&#93;&#91;b&#93;Text1&#91;/center&#93;&#91;right&#93;Text2&#91;/b&#93;&#91;/right&#93;
    Das wiederum ist ja erst recht kein richtiger Code. Es gibt auch noch weitere Beispiele, bei denen meine Funktion nicht richtig funktioniert. Deswegen brauche ich eine Funktion, die den Code in jedem Fall richtig umformt. Leider habe ich keine Ahnung wie dafür der reguläre Ausdruck aussehen müsste und ob das nicht auch anders geht. Wäre echt nett, wenn mir dabei jemand helfen könnte.

  6. #6
    Forum Guru
    Registriert seit
    28.12.2004
    Ort
    Ringgenberg(bei Interlaken) / Schweiz
    Beiträge
    4.787
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    also wofür benötigst du das ganze jetzt genau?1

    PS.... allein mit regex kommst du da definitv nicht weiter.

    da muss da am besten eine etwas umfangreiche klasse her.

    diese würde ich dann so aufbauen,

    das du deinen Text anhand von regex zerlegst und in einer array ablegst. das heist

    code->*****
    type->bold

    wüstest du wie soetwas zu lösen ist ?!

    also das heist alle bbcodes erstmal entfernen und dann halt wieder geordnet zusammensetzen.

  7. #7
    Teeny
    Themenstarter

    Registriert seit
    13.01.2006
    Beiträge
    39
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Der Parser den ich mir geholt habe funktioniert ja auch so. Keine Ahnung, ob ich das aber auch selber hinkriege. Gibt es denn keine Möglichkeit, dass mit preg_replace und regulären Ausdrücken zu machen? Das Hauptproblem ist denke ich mal, dass die regulären Ausdrücke immer auf das größtmögliche bezogen werden. Das müsste bei mir eigentlich umgekehrt sein. Kann man das irgendwie ändern?

  8. #8
    Forum Guru
    Registriert seit
    28.12.2004
    Ort
    Ringgenberg(bei Interlaken) / Schweiz
    Beiträge
    4.787
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    nein das kannst du definitiv nicht mit regex lösen wie den auch...

    da verstehst du das mit den regext nicht so ganz.

    du kannst mit denen doch auch nur fester vorkommnisse ändern.

    oder willst du etwa mittels regex alle möglichen verdrehungen berücksichtigen ?!

    da musst du schon was anderes aufweisen.

    du musst immer darandenekn das die maschiene nicht wies wie es gehört.

    da hilft meienr meinung nach nur schritweises auslesen und wieder ordentlich zusammenbauen.

  9. #9
    Teeny
    Themenstarter

    Registriert seit
    13.01.2006
    Beiträge
    39
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Hm, ok. Ich guck mal, ob ich das hinbekomme. Jedenfalls erstmal vielen Dank. Du hast mir auf jeden Fall geholfen.

Ähnliche Themen

  1. html code funkt. nicht mit dem internetexplorer
    Von marching drums im Forum HTML & CSS Forum
    Antworten: 6
    Letzter Beitrag: 25.06.2008, 20:30
  2. HTML-Code soll nicht angezeigt werden.
    Von 19Eike91 im Forum HTML & CSS Forum
    Antworten: 10
    Letzter Beitrag: 01.04.2007, 14:13
  3. html code, text nicht markierbar??
    Von |o|o im Forum HTML & CSS Forum
    Antworten: 13
    Letzter Beitrag: 27.09.2006, 09:23
  4. HTML-Code einbauen - klappt nicht!
    Von Doofi im Forum HTML & CSS Forum
    Antworten: 14
    Letzter Beitrag: 27.06.2006, 23:51
  5. Fehler im Html-Code? Nicht alle Bilder werden angezeigt.
    Von Shaybe im Forum HTML & CSS Forum
    Antworten: 1
    Letzter Beitrag: 08.11.2004, 02:51

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •