Seite 1 von 2

BBcode extern in html wandeln

Verfasst: 07.12.2004 16:42
von Root007
Hi,

ich les mir grad einige Posts aus der Forums-Datenbank aus und geb sie auf einer externen Seite aus. Soweit ja mal kein Problem...

Nur schaff ich es irgendwie nicht, den BBcode richtig in html umzuwandeln :-?

Derzeit sieht das so aus:

Code: Alles auswählen

	// BBCode durch html ersetzen
//	$post_text = str_replace("[b:" . $UID . "]", "<strong>", $post_text); 
	$post_text = str_replace("[b:]","<strong>",$post_text);
//	$post_text = str_replace("[/b:" . $UID . "]", "<strong>", $post_text); 
	$post_text = str_replace("[/b:]","</strong>",$post_text);

	$post_text = str_replace("[i]","<em>",$post_text);
	$post_text = str_replace("[/i]","</em>",$post_text);
		
	$post_text = str_replace("[u:$uid]","<u>",$post_text);
	$post_text = str_replace("[/u:$uid]","</u>",$post_text);
		
	$post_text = preg_replace('/\[quote=(.*)\](.*)\[\/quote\]/Usi','<div style=\"padding: 7px\">$2</div>',$post_text);
	
	$post_text = str_replace("[quote]","<strong>Quote</strong><em>",$post_text);
	$post_text = str_replace("[/quote]","</em>",$post_text);
		
	$post_text = str_replace("[code]","<strong>Code</strong><em>",$post_text);
	$post_text = str_replace("
","</em>",$post_text);

$post_text = preg_replace('/\[list\](.*)\[\/list\]/si',"<div style=\"padding: 7px\">$1</div>",$post_text);
$post_text = preg_replace('/\
  • (.*)\[\/list\]/si',"<div style=\"padding: 7px\">$1</div>",$post_text);

    $post_text = str_replace("[img]","<img src=\"",$post_text);
    $post_text = str_replace("[/img]","\" alt=\"image\" />",$post_text);

    $post_text = preg_replace('/\[url\](.*)\[\/url\]/Usi','<a href="$1">$1</a>',$post_text);
    $post_text = preg_replace('/\[url=(.*)\](.*)\[\/url\]/Usi','<a href="$1">$2</a>',$post_text);

    $post_text = str_replace("\n", "\n<br />\n", $post_text);

    $pattern = array ('/\[quote:=\'/', '/\'\]/', '/\[quote:\]/', '/\[\/quote:\]/', '/\[code:(.*?)\]/', '/\[\/code:\]/', '/\[(.*?)\]/si'); // nix
    $replace = array ('', '<b>', '</b>:: ', '<b>Zitat: </b>', '</br>', '<b>Code: </b>', '</br>', ''); // nix
    $post_text = preg_replace($pattern, $replace, $post_text); // nix

    $post_text = ( $include == '1' ) ? $post_text : smilies_pass_recent($post_text);
    // $post_text = str_replace("\n", "\n<br />\n", $post_text);
    $post_text = make_clickable($post_text); [/code]
    Der vorletzte Dreierblock (mit // nix) löscht mir grad seltsamerweise einfach den Code...
    Eigentlich würd ich diese drei Zeilen gern löschen, nur funktioniert dann gar nix - der restliche Code tut gar nix :oops: , obwohl er eigentlich sollte. Besser gesagt, dann krieg ich als Ausgabe immer z.b. [b:4kue8h2w]blabla[/b:4kue8h2w]. Irgendwie stört den glaub diese UID, nur wie schaff ich das dass der die nicht beachtet?

    Ich blicks echt nimmer :cry:

Verfasst: 07.12.2004 18:55
von Blutgerinsel
Auf jedes Problem gibt es eine logische Antwort....Und jede Antwort kann man finden wenn man sich bemüht und ein Debugging durchführt...

Da du aber statt in einer Streichholzschachtel in einer Lagerhalle suchst wirst du den Fehler aufgrund eines Glückfalles evtl. finden ansonsten wohl nicht......

Abgesehen davon warum einmal $UID und einmal $uid verwendest ist mir schleierhaft auch ob die Variable überhaupt einen Wert hat......

All das ist dein Part.....

Verfasst: 07.12.2004 20:05
von Root007
Blutgerinsel hat geschrieben:Auf jedes Problem gibt es eine logische Antwort....Und jede Antwort kann man finden wenn man sich bemüht und ein Debugging durchführt...
Danke - hätt ich nicht gedacht. Wofür brauchts dann dieses Forum? Ich nehm liebend gern Hilfe zur Selbsthilfe an (will ja schon was verstehen), aber leider bin ich auch nicht allwissend ;)
Blutgerinsel hat geschrieben:Da du aber statt in einer Streichholzschachtel in einer Lagerhalle suchst wirst du den Fehler aufgrund eines Glückfalles evtl. finden ansonsten wohl nicht......
Wie soll ich dann vorgehen?
Blutgerinsel hat geschrieben:Abgesehen davon warum einmal $UID und einmal $uid verwendest ist mir schleierhaft auch ob die Variable überhaupt einen Wert hat......
Das kommt von der Probiererei... Und ich dachte irgendwie, hauptsache ne Variable wo die uid reinkommt - ich will ja nix mit der machen (keine Überprüfung auf Korrektheit oder so).
Blutgerinsel hat geschrieben:All das ist dein Part.....
Wiegesagt, wofür dann dieses Forum? Hilfe zur Selbsthilfe war das aus meiner Sicht jetzt eigentlich nicht... :roll:


EDIT: Also, ich hab mal nur eins versucht:

Code: Alles auswählen

$post_text = str_replace('[b:$uid]','<strong>',$post_text);
$post_text = str_replace('[/b:$uid]','</strong>',$post_text);
So passiert absolut gar nichts, obwohl das in der /includes/bbcode.php so in etwa drinsteht. Was ist da falsch?

Dann hab ich das selbe nur über einen anderen Weg versucht:

Code: Alles auswählen

$pattern = array ('[b:$uid]', '[/b:$uid]');
	$replace = array ('<strong>', '</strong>');
$post_text = preg_replace($pattern, $replace, $post_text);
So passiert ebenfall nichts, und wenn ich ":$uid" weglass wird zwar was fett, aber es steht immer noch dieser Fetzen da [:d4h28sb48d], nur das b fehlt halt. Was ist da falsch?

Verfasst: 08.12.2004 00:04
von QCO
Also ich hab mir deinen Code jetzt nicht genau angeschaut, nur mal überflogen, will aber auch mal meinen Senf dazu geben. Also los gehts:
1) phpbb markiert BBCode mit einem eindeutigen String (passiert beim Einspeichern in die DB) (das ist hier wohl "4kue8h2w")
2) Mal angenommen, dass du den Code zum wiederherstellen von HTML aus BBCode aus phpbb kopiert hast, dann musst du wohl auch wieder mit diesem String arbeiten. D.h. da, wo bei dir dieses $UID steht, muss besagter String hin. Also musst du dafür sorgen, dass $UID den zum Post gehörenden Wert bbcode_uid (auch Tabelle phpbb_posts_text) bekommt.
2b) Falls du NICHT den phpbb-Code verwendest: Warum nicht? Der funktioniert und weiß auch, wie man mit phpbb-Daten umgeht.
3) Warum benutzt du nicht die phpbb-Funktionen? Da gibts vier Funktionen oder so, die machen die ganzen replaces (zu finden in includes/bbcode.php)?

So hab ich das auch gemacht, als ich mir folgende Funktion für mein Projekt geschrieben hab. Ich hab einfach den Code aus viewtopic.php kopiert und ein bisschen angepasst.

Code: Alles auswählen

function parse_text_bbcode($string, $bbcode_uid = false, $parse_bbcode = true, $parse_smilies = true, $parse_html = false)
{
	global $board_config, $phpbb_root_path, $phpEx;

	include_once($phpbb_root_path . 'includes/bbcode.'.$phpEx);

	//
	// Note! The order used for parsing the message _is_ important, moving things around could break any
	// output
	//

	//
	// If the board has HTML off but the post has HTML
	// on then we process it, else leave it alone
	//
	if ( !$board_config['allow_html'] )
	{
		if ( $parse_html )
		{
			$string = preg_replace('#(<)([\/]?.*?)(>)#is', "<\\2>", $string);
		}
	}

	//
	// Parse message and/or sig for BBCode if reqd
	//
	if ( $board_config['allow_bbcode'] )
	{
		if ( $bbcode_uid === false )
		{
            $bbcode_uid = make_bbcode_uid();
            $string = bbencode_first_pass($string, $bbcode_uid);
		}
		if ( $bbcode_uid != '' )
		{
			$string = ( $parse_bbcode ) ? bbencode_second_pass($string, $bbcode_uid) : preg_replace('/\:[0-9a-z\:]+\]/si', ']', $string);
		}
	}

	$string = make_clickable($string);

	//
	// Parse smilies
	//
	if ( $board_config['allow_smilies'] )
	{
		if ( $parse_smilies )
		{
			$string = smilies_pass($string);
		}
	}


	//
	// Replace naughty words
	//
	if (count($orig_word))
	{
		$string = str_replace('\"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $string . '<'), 1, -1));
	}

	//
	// Replace newlines (we use this rather than nl2br because
	// till recently it wasn't XHTML compliant)
	//
	$string = str_replace("\n", "\n<br />\n", $string);


	return $string;
}
[edit] Entschuldige, klingt ein bisschen forsch und unnett. Hab grad schlechte Laune. Konnte aber hoffentlich trotzdem zur Klärung beitragen...

Verfasst: 08.12.2004 00:18
von MrMind
Root007 hat geschrieben:
Blutgerinsel hat geschrieben:Auf jedes Problem gibt es eine logische Antwort....Und jede Antwort kann man finden wenn man sich bemüht und ein Debugging durchführt...
Danke - hätt ich nicht gedacht. Wofür brauchts dann dieses Forum? Ich nehm liebend gern Hilfe zur Selbsthilfe an (will ja schon was verstehen), aber leider bin ich auch nicht allwissend ;)
Da muss ich aber Blutgerinsel recht geben.

Ich hatte eben grad auch meine Probleme mit meiner BBCode-Klasse die auch uid's verwendet. Und zwar wurde die UID immer wieder gelöscht (richtig verwendet, aber beim beenden der Methode war sie aufeinmal leer und dort hatte ich auch immer eine Anweisung um diese UID außerhalb der Methode public zu machen).

Und weißt du wie ich vorgegangen bin???

Bestimmt nicht ;)

Ich habe überall dort wo ich den Fehler vermutet habe, mal Echos gesetzt und geguckt, was eine Variable wie die $uid für einen Inhalt hat.

Versuch du das doch auch mal. Check mal die ganzen Inhalte deiner Variablen um auf den Fehler zu kommen.

Wir wissen zum Beispiel nicht, was in deiner Variable $post_text steht. Ob da nun [b\] oder [b:4gh35Ft692] steht (das \ habe ich gemacht um diesen BBCode zu deaktivieren).

Such mal anhand dieser Methode deinen Fehler, wenn du ihn dann nicht gefunden hast, dann kannst du anhand deiner Debugging Methode uns nährere Auskunft geben (mit Beispielinhalten) die uns einen Schritt weiter bringen, dir beim Fehlerfinden zu helfen.

Mfg
MrMind

Verfasst: 08.12.2004 00:42
von Blutgerinsel
Dieses str_replace Gesocks nunja finde ich auch nicht so berauschend......

Regulärer Ausrücke machen es doch echt einfach:

Um zu ersetzen würde ich vll.

Code: Alles auswählen

preg_replace('!\[((b):[a-z0-9]+)\](.*)\[/\1\]!i','<\2>\3</\2>',$post_text);

Verfasst: 08.12.2004 00:52
von MrMind
Ich habe das so in meiner BBCode-Klasse stehen:

Code: Alles auswählen

$text = preg_replace('#\[b:' . $uid . '\](.*?)\[/b:' . $uid . '\]#si','<b>\\1</b>',$text);
Eine Zeile die alles enthält und auf Groß- und Kleinschreibung keine Rücksicht nimmt ;)

Und auch nur die ersetzt die die UID haben und nicht ersetzt die kein Endtag besitzen.

Mfg
MrMind

Verfasst: 08.12.2004 00:57
von Blutgerinsel
ok meins ersetzt alle gültige Vorkommen wo ein Starttag auf ein Endtag passt den Rest interessiert es nicht....Dafür würde ich mir einen Endcommand vorbehalten der alles was noch so sinnlos rumgeistert in seine Bits zerlegt :D

Verfasst: 08.12.2004 14:59
von Root007
Hi,

vielen Dank für eure Antworten! Ich muss aber glaub nochmals darauf hinweisen, dass ich mit php nicht so sehr vertraut bin (hätt ich schon am Anfang machen sollen). Ihr dürft schon einen gewissen Einsatz von mir erwarten (ich will keine fertige Lösung), aber ich hatte echt absolut keine Idee mehr was ich machen soll, wirklich nicht!

@QCO: Ich hab den größten Teil der Umwandlungen von irgend nem anderen Portal-Mod, weiß aber grad nicht mehr wirklich den Ursprung, weil ich schon ziemlich lange damit rummach. Und dann hab ich ja mal für b den entsprechenden Code aus der bbcode.php genommen:

Code: Alles auswählen

$text = str_replace("[b:$uid]", $bbcode_tpl['b_open'], $text);
Allerdings hat's mit dem halt nicht geklappt (den Teil mit bbcode_tpl hab ich durch den html-Teil ersetzt - und die Variable auch angepasst).

@Blutgerinsel: Ne Frage: preg_replace ersetzt einen Ausdruck, und str_replace eine String? Was genau ist da der Unterschied? Muss man nicht bei beiden den Anfang und das Ende angeben und alles dazwischen wird ersetzt?

@MrMind: Fast genau so hatte ich das auch mal, nur ohne "#\", und ohne "(.*?)", und ohne "#si". Was bewirken diese Stellen? Ist "(.*?)" ne Art Variable die dann bei "\\1" hingesetzt wird?

EDIT: So, wer sich mal die Datei ansehen will: test.php, reiner Text.

In $post_text ist der Text des Beitrags drin, den geb ich zweimal aus, als erstes kursiv, und dann - nach dem gewollten Umwandeln von b in <b> nochmal, dann unterstrichen.
Wie ihr seht, kommt beidesmal das selbe raus - ohne den bbcode umgewandelt zu haben.

Der restliche Teil ist die recent.php von Acid, die ich um die Ausgabe des Post-Text erweitern wollte/will.

Verfasst: 08.12.2004 17:04
von MrMind
Root007 hat geschrieben:@MrMind: Fast genau so hatte ich das auch mal, nur ohne "#", und ohne "(.*?)", und ohne "#si". Was bewirken diese Stellen? Ist "(.*?)" ne Art Variable die dann bei "\\1" hingesetzt wird?
Naja so in der Art.

# ist in diesem Fall ein delimiter,
si sind Modus-Zustände: s = das ein . auch ein \n erkennt (normalerweise macht er das nämlich nicht) und i = groß und kleinschreibung wird nicht berücksichtigt.

(.*?) bedeutet Suche nach allen Zeichen und zwar dürfen diese mehrmals oder einmal vorkommen, aber so wenig wie möglich.

Dadurch das ich da ne Klammer gesetzt habe, kann ich die gefundenen Sachen mit \\1 wieder verwerten ohne zu wissen, was da drin steht ;)

\\NUMMER wird bei regExp wie folgt ausgewertet:

erste geöffnete Klammer 1 liegt nun eine weitere Klammer darin wird die als 2 gewertet usw. und wenn die Klammer mit Nummer 1 schließt und danach folgt wieder eine Klammer, dann wird diese beim zu letzt verwendeten Nummer weitergezählt:

(//1(//2(//3)))(//4)

Das soll nur das Schema darstellen.

Mfg
MrMind