strip_tags

sipoh

Erfahrenes Mitglied
Hallo,

ich speichere in einer Textarea gemachte Angaben folgend in die Datenbank:

Code:
$textchar = strip_tags($_POST['eintrag'], '<br/><b><font><object><a>');
$text = nl2br($textchar);

..
$text->DB

strip_tags sollen alle Tags und sonstige relevanten Ausführungen unterdrücken. Außer: br, b, font (inkl. der Attribute) object (flash etc).

Bis auf <br/> wandelt er alle Tags aber um, so dass ich sie nicht mehr richtig ausgeben kann. (aus < wird &lt;) Ersätze ich das &lt; mit < vor der Ausgabe aber wieder, gibt er mir sämtliches aus, also auch sowas : <?php echo ".."; ?>
 
Anscheinend wird irgendwo [phpf]htmlspecialchars[/phpf] oder eine ähnliche Funktion aufgerufen?

Falls es sein muss, verwende [phpf]htmlspecialchars_decode[/phpf].
 
Alle geforderten Attribute werden nun korrekt umgesetzt.

Bis auf <object>

Das gibt er aus (lt. Quelltext):

HTML:
&lt;object style='width:200px;height:173px;' width='200' height='173' type='application/x-shockwave-flash' data='http://www.myvideo.de/movie/113'&gt; &lt;param name='movie' value='http://www.myvideo.de/movie/113'/&gt;&nbsp;&lt;param name='AllowFullscreen' value='true' /&gt; &lt;/object&gt;&lt;br/&gt;&lt;a href='http://www.myvideo.de/watch/113' title='Ehe kann so schoen sein - MyVideo'&gt;Ehe kann so schoen sein - MyVideo&lt;/a&gt;
 
Ich wollte eigentlich wissen, wie die Daten mit PHP ausgegeben werden, also welche Anweisung/Funktion etc. genutzt wird.
 
So, habe ich doch nicht geahnt. :)

Standardmäßig über echo, ala echo $row['text'];

Die anderen Attribute werden ja unkonvertiert in die DB gespeichert. Tags bleiben erhalten. Nur eben nicht bei MyVideo-Flash-Objekten.
 
Ok, ich habe es jetzt mit BBCode gelöst. Für alle, die es wichtig finden:

Code:
<?php

function bbcode ($entry) {
global $query,$result2,$connect,$replace,$table_smilies;

$entry = eregi_replace("
","<br>",$entry);
$entry = eregi_replace("\[b\]([^\[]+)\[/b\]","<b>\\1</b>",$entry);
$entry = eregi_replace("\[i\]([^\[]+)\[/i\]","<i>\\1</i>",$entry);
$entry = eregi_replace("\[u\]([^\[]+)\[/u\]","<u>\\1</u>",$entry);
$entry = eregi_replace("\[img\]([^\[]+)\[/img\]","<img src=\"\\1\" border=\"0\">",$entry);
$entry = eregi_replace("\[mail\]([^\[]+)\[/mail\]","<a href=\"mailto:\\1\">\\1</a>",$entry);
$entry = eregi_replace("\[url\]([^\[]+)\[/url\]","<a href=\"\\1\" target=\"_blank\">\\1</a>",$entry);
$entry = eregi_replace("\[url=\"([^\"]+)\"]([^\[]+)\[/url\]","<a href=\"\\1\" target=\"_blank\">\\2</a>",$entry);
$entry = eregi_replace("\[youtube\]([^\[]+)\[/youtube\]","<object width=\"300\"><param name=\"movie\"><embed src=\"http://www.youtube.com/v/\\1\" type=\"application/x-shockwave-flash\" width=\"300\"></embed></object>",$entry);
$entry = eregi_replace("\[myvideo\]([^\[]+)\[/myvideo]","<object width=\"425\" height=\"367\" type=\"application/x-shockwave-flash\" data=\"http://www.myvideo.de/movie/\\1\"><param name=\"movie\" value=\"http://www.myvideo.de/movie/\\1\"/><param name=\"AllowFullscreen\" value=\"true\"></object>",$entry);
return $entry;

// Einbinden / Verwenden der function
// $text=bbcode($alter text);
} 

?>

Neben den Standard-Formatierungen ist es möglich, YouTube und MyVideo-Filme einzubinden. Das geht so:

[youtube]4_qd0Zl8CiA&rel=1[/youtube]
[myvideo]3275904[/myvideo]
 
Du solltest etwas vorsichtiger sein, was die Ausgabe von Benutzereingaben betrifft. Denn derzeit könnte auch Schadcode eingeschleust werden, insbesondere über die Attribute der ersetzten HTML-Elemente.
Du solltest also entweder die Suchmuster einschränken und die Eingabewerte nur maskiert ausgeben.
 
Ok, das wird berücksichtigt. Danke für den Tipp.

Noch ne Frage: Wie kann ich zb. bei einer reinen Textausgabe sagen, dass alles, was [ youtube]xyz[ /youtube] ist, nicht angezeigt werden soll?

Ich habe es so angefangen, der Inhalt zwischen den Tags wird aber nicht berücksichtigt und steht weiterhin da.

PHP:
function replace ..
$ausgabe = str_replace("[ youtube]","",$ausgabe);
$ausgabe = str_replace("[ /youtube]","",$ausgabe);
return ..
 
Zurück