html und vbCode problem

Chino

Erfahrenes Mitglied
moin !

ich hab ein news system, in dem ich html code verbieten möchte, aber dennoch einige html befehle durchlassen möchte (links, fontformatierung etc.) in dem system gibt es auch eine vorschau funktion, die den eintrag erst nochmals (bereits formatiert) angezeigt und beim nochmaligem abschicken des formulars in die datenbank eingeträgt.

und hier liegt das problem :
obwohl ich den eintrag nur beim ersten durchlauf umformatieren lasse, wird, wenn ich mir den eintrag anzeigen lasse, hier zwar alles korrekt gefiltert und dementsprechend angepasst. wenn ich dann den eintrag in der db speichern lasse, werden die zuvor als textdargestellten html befehle wieder zurück in html befehle umgewandelt. die ganzen sonderzeichen, werden danach auch wieder zurück ungewandelt, obwohl die auf der vorschau seite richtig umformatiert wurden.

hier mal der code der funktion:

PHP:
function normalCode_message($post) {
	global $vorschau;

if($vorschau == "preview" OR $vorschau == "") {

   	$post = stripslashes($post);
	$post = htmlspecialchars($post);
        $post = trim($post);

   	// umlaute, ß, &, ' und ´ konvertieren:
   	$post = str_replace("ä","ä",$post);
	$post = str_replace("ö","ö",$post);
	$post = str_replace("ü","ü",$post);
   	$post = str_replace("ß","ß",$post);
   	$post = str_replace("& ","& ",$post);
   	$post = str_replace("'","´",$post);
   	$post = str_replace("´","´",$post);
   	$post = str_replace('"','"',$post);

   // bold text
   $post = preg_replace("/\[b\](.*)\[\/b\]/iUms","<b>\\1</b>",$post);

   // italic text
   $post = preg_replace("/\[i\](.*)\[\/i\]/iUms","<i>\\1</i>",$post);

   // underline text
   $post = preg_replace("/\[u\](.*)\[\/u\]/iUms","<u>\\1</u>",$post);

   { hier stehen noch ein paar preg_replace funktionen für links ,
     die lass ich mal weg}

   // absatz einfügen:
	$post = str_replace("\n","<br>",$post);
}
 
   if($vorschau == "previewed") {
   		$post = str_replace("&lt;br&gt;","<br>",$post);
   }
   
   return $post;
}

im formular gibt es ne checkbox (= variable $vorschau). bevor der eintrag umformatiert wird, wird die value abgefragt. der eintrag wird nur umformatiert, wenn die variable die value "preview" (eintrag umformatieren und anzeigen) oder "" (eintrag umformatieren und direkt in die db eintragen) hat.

ich bin ratlos. warum macht das script irgendwas, was ich nirgendwo gesagt habe ? :rolleyes:
 
aus dem code war jetzt nicht ersichtlich wann du $code in die db speicherst, auf alle fälle muss der speichervorgang nach dem aufruf der funktion passieren..., schreib mal den codeschnipsel rein, wo du die funktion speicherst
 
so, hier:

PHP:
function normalCode_message($post) {
	global $vorschau;

if($vorschau == "preview" OR $vorschau == "") {

   	$post = stripslashes($post);
	$post = htmlspecialchars($post);
	$post = trim($post);

   	// umlaute, ß, &, ' und ´ konvertieren:
   	$post = str_replace("ä","&auml;",$post);
	$post = str_replace("ö","&ouml;",$post);
	$post = str_replace("ü","&uuml;",$post);
	$post = str_replace("ß","&szlig;",$post);
   	$post = str_replace("& ","&amp; ",$post);
   	$post = str_replace("'","&acute;",$post);
   	$post = str_replace("´","&acute;",$post);
   	$post = str_replace('"','&quot;',$post);

   // bold text
   $post = preg_replace("/\[b\](.*)\[\/b\]/iUms","<b>\\1</b>",$post);

   // italic text
   $post = preg_replace("/\[i\](.*)\[\/i\]/iUms","<i>\\1</i>",$post);

   // underline text
   $post = preg_replace("/\[u\](.*)\[\/u\]/iUms","<u>\\1</u>",$post);

   // absatz einfügen:
	$post = str_replace("\n","<br>",$post);
}
 
   if($vorschau == "previewed") {
   		$post = str_replace("&lt;br&gt;","<br>",$post);
   }
   
   return $post;
}
// ##################################
// action überprüfen: eintragen
if($action == "") {

	if($headline == "" || $text == "") {
		$headline = stripslashes($headline);
		$text = stripslashes($text);
		include("inc/error.inc.php");

	}else if($headline != "" AND $text != "") {		

		$text = normalCode_message($text);

	     if($vorschau == "preview") {

			// eingaben zuerst anzeigen, bevor in die db eintragen
			include("inc/preview.inc.php");

	     } else {		
			mysql_query("INSERT INTO $cfg_tablename (headline, text, time) VALUES('$headline', '$text','".time()."')");

			echo "<div align=\"center\" class=\"text\">$cfg_save_confirm1</div>";
			echo "<div align=\"center\" class=\"text\">$cfg_save_confirm2</div>";
			echo "<div align=\"center\" class=\"text\">$cfg_save_confirm3</div>";
		}
	}
 
*verzweifel* :mad:

irgendwie will das nich. nochma die genaue fehlerbeschreibung:

text wird eingegeben, beinhaltet sowohl html code und vbCode (und noch sonderzeichen). wenn im formular die checkbox für die vorschau aktiviert ist, wird der beitrag erst nochmals fertig formatiert (html wird als text dargestellt, vbCode wird in html umgewandelt, sonderzeichen werden ebenfalls umgewandelt) dargestellt. bis hier klappt das auch wunderbar. wenn das formular jetzt nochma abgeschickt wird, dann wird der text in der db gespeichert. und hier liegt der fehler. jetzt werden text-html teile wieder zurück in html-tags umgewandelt, die html-tags für die sonderzeichen werden ebenfalls zurück in die enstprechenden zeichen umgewandelt. nur die stelle, an der der vbcode stand, bleibt gleich. wenn ich allerdings den eintrag direkt eintrage, gehts ebenfalls perfekt.

also liegt es irgendwie daran, dass der text zwei mal formatiert wird. aber selbst ne abfrage, ob der eintrag erst angezeigt wurde, bringt nix (die variable $vorschau hat als value entweder "preview" (=eintrag soll angezeigt werden), "previewed" (=eintrag wurde angezeigt) oder "" (=direkt in der db speichern)!)

vor allem versteh ich net, warum der denn einfach alles zurück umwandelt, was ich ja nirgendswo gesagt hab ... ???

ich bin mit meinem latein am ende ... *kopfschüttel*

jemand n tipp? andere lösungvorschläge? irgendwas?
 
Zuletzt bearbeitet:
aha, haha!!!

ich hab deinen fehler gefunden!!!!

und zwar wandelst du doch den text um gell und machst dann die vorschauabfrage. DORT ist dein fehler, denn die funktion erstellt nämlich die html-codes die du nicht willst, deswegen musst du das so machen:

PHP:
}else if($headline != "" AND $text != "") {        

        

         if($vorschau == "preview") {
            $vorschautext = normalCode_message($text);
            // eingaben zuerst anzeigen, bevor in die db eintragen
            include("inc/preview.inc.php");

         } else {        
            mysql_query("INSERT INTO $cfg_tablename (headline, text, time) VALUES('$headline', '$text','".time()."')");

            echo "<div align=\"center\" class=\"text\">$cfg_save_confirm1</div>";
            echo "<div align=\"center\" class=\"text\">$cfg_save_confirm2</div>";
            echo "<div align=\"center\" class=\"text\">$cfg_save_confirm3</div>";
        }
    }

jetzt wird nämlich nur der text umgewandelt der auch wirklich ausgegeben wird, in die datenbank kommt nur der unformatierte text, also mit den vbCodes
 
Original geschrieben von methodus
aha, haha!!!

ich hab deinen fehler gefunden!!!!

und zwar wandelst du doch den text um gell und machst dann die vorschauabfrage. DORT ist dein fehler, denn die funktion erstellt nämlich die html-codes die du nicht willst, deswegen musst du das so machen:

PHP:
}else if($headline != "" AND $text != "") {        

        

         if($vorschau == "preview") {
            $vorschautext = normalCode_message($text);
            // eingaben zuerst anzeigen, bevor in die db eintragen
            include("inc/preview.inc.php");

         } else {        
            mysql_query("INSERT INTO $cfg_tablename (headline, text, time) VALUES('$headline', '$text','".time()."')");

            echo "<div align=\"center\" class=\"text\">$cfg_save_confirm1</div>";
            echo "<div align=\"center\" class=\"text\">$cfg_save_confirm2</div>";
            echo "<div align=\"center\" class=\"text\">$cfg_save_confirm3</div>";
        }
    }


jetzt wird nämlich nur der text umgewandelt der auch wirklich ausgegeben wird, in die datenbank kommt nur der unformatierte text, also mit den vbCodes

nope, daran liegts leider auch nich. denn dann würde der text ja nur formatiert werden, wenn der angezeigt wurde ($vorschau == "preview"). wenn der text direkt in die db eingetragen wird ($vorschau == ""), würde der ja ohne unformatiert zu werden eingetragen. deswegen wird der text ja auch vor der abfrage (ob vorschau oder nich) an die funktion übergeben und umformatiert.

was ich aber absolut nich verstehe is, warum der nach der vorschau aus
Code:
&_ouml; (ohne _)
wieder ö macht (für die anderen sonderzeichen das gleiche) ??? WO im script steht das ?

hm, kann es vielleicht daran liegen, dass ich den text im vorschau script in einem hidden field drin stehen habe damit das beim erneuten absenden auch mitübergeben wird ?

sollte ich besser zwei verschiedene buttons machen (so wie hier im board) ?? jetzt isses halt über eine checkbox ($preview) gelöst.

***edit**

also an der abfrage am anfang der funktion liegt das prob auch net ! denn: an der stelle wo anfangs der vbCode stand wird der html code, der nach dem umformatieren entstanden ist, NICHT umformatiert.

ich glaub langsam echt, das hat mich dem hidden field zu tun ...

***edit***

thx for help !!
 
Zuletzt bearbeitet:
so, hab den fehler jetzt endlich behoben !! :)

und zwar lag es wie ich schon vermutet hatte am hidden field, das in der preview.inc.php drin war und den ganzen (umformatieren) text enthielt.

jetzt wird, wenn die vorschau angezeit wird, das formular einfach unten drangehängt mit dem text so wie er eingegeben wurde (so wie hier hier im board). dann muss man zwar was scrollen (langes formular) aber dafür is man auf einer seite und muss nich immer zurück gehen wenn man was ändern will. guter kompromiss ;)

cyas,
chino
 
Zurück