HTML Code ausgeben anstatt interpretieren

Prijv

Mitglied
Hallo,

Mein Problemist, ich möchte mithilfe von einem Admin-formular und einer datenbank, meine seite updaten.

Soweit so gut.

Es werden beiträge auch angezeigt und zwar einfach in dem die Textfelder eben aus der datenbank gezogen werden.

Vor dem anzeigen werden sie noch geparst.

Das heisst smilies : ) werden zu :) bildsmilies [-b-] zu < b >

Jetzt ist aber das problem. Ich möchte wie es auch hier im forum möglich ist. Auch Codebeispiele ausgeben und zwar nicht interpretiert.

Dazu habe ich um den code herum [-code-] code hier [/-code-] eine textmarke gesetzt.

Jetzt habe ich probiert eine funktion zu schreiben welche mir mithilfe von Regulären Ausdrücken eben dieses code-stück sucht und es in einer variable speichert. Diese variable mit htmlspecialchars() in sonderzeichen umwandelt und danach an diesem [code] ort wieder einfügt.

noch ein anderer lösungsansatz war:
PHP:
function code2uml($text)
{
       	$inputstring = "#<code>(<)<\/code>/#sm";
	$outputstring = "&lt;";
	// parsing
	$text = preg_replace($inputstring,$outputstring,$text);
	
	$inputstring = "#<code>.*(>).*<\/code>#sm";
	$outputstring = "&gt;";
	// parsing
	$text = preg_replace($inputstring,$outputstring,$text);
}

Jedoch gabs da ein paar probleme.

Nun meine frage:

Hat jemand einen anderen Lösungsansatz, oder ein beispielscript oder sonst eine Hilfe ??

Gruässli Prijv
 
Zuletzt bearbeitet:
Kannst du die Probleme mal posten?

Ich würde es so machen:
(Die letzte Zeile einfach mit in das Script kopieren, sonst zerhackelt es das Board, wenn ich es mit Syntaxhiglighting mache)

PHP:
function makecode($txt) {
  $txt = str_replace("<", "&lt;", $txt);
  $txt = str_replace(">", "&gt;", $txt);

  return $txt;
}

$text = preg_replace("=\[code\](*.)\[\/code\]=eisU", "makecode('$1')", $text):


Ist ungetestet.
 
könnte ich wenn ich deine letzte zeile benütze, dort wo du die funktion aufrufst, auch einfach htmlspecialchars($text) aufrufen ??
merci
:)

und noch eine frage, Was bedeutet diese =eisU ??

edit:

nun kriege ich eine Fehlermeldung:


Warning: Compilation failed: nothing to repeat at offset 9 in /home/biohazard/www/netstreet/functions.inc.php on line 54
 
Zuletzt bearbeitet:
so ich dachte mir,

$text = ereg_replace("\[code\](.*)\[/code\]", htmlspecialchars('$1'), $text);

edit: auch diese ist irgendwie falsch
$text = preg_replace("=\[code\](.*)\[/code\]=eisU", htmlspecialchars('$1'), $text);


Aber leider findet er mir so viel zu viel und ändert an völlig undlogischen und falschen Orten die Zeichen ab und wandelt sie um.

gesucht: RegExpr. welche alles Innerhalb eines [ code ] hier-code [ /code ] blocks findet und dort die html specialchars umwandelt.

noch eine andere frage, was kann man alles für Parameter anhängen (eisU = ? )
 
Zuletzt bearbeitet:
e = Text wird als Programmcode interpretiert -> sollteste rausnehmen!
s = "." trifft auch auf zeilenumbrüche zu
U = sucht nach kürzestem treffer
i = case insensitiv

$pattern = "/\[-code-\](.*)\[-code-\]/isU";

wäre dann dein regulärer ausdruck, ersetzen tust du das dann so:

$replace = "<code>\\1<code>";
preg_replace($pattern,$replace,$text);

so müsste es klappen, die 3 zeilen text sind ausreichend.
 
Nun, mein Code funktioniert nun mal soweit.. dass er innerhalb dieses CODE blocks auch tatsächlich anschlägt und danach < > die klammern ersetzt, jedoch nicht alle sondern nur den ersten oder einfach EINEN Ausdruck .

Wie kriege ich es hin, dass er bei ALLEN HTML ausdrücken, also diesen klammern hält und sie umschreibt ?

edit: mein ausdruck:

$text = preg_replace("=(\[code\])(.*)(<)(.*)(>)(.*)(\[/code\])=si" ,"\\1\\2&lt;\\4&gt;\\6\\7", $text);
 
Hab mein Problem gelöst, wenn jemand Interesse an der Lösung hat ;)

...
PHP:
	preg_match("=\[code\](.*<.*>.*)\[/code\]=siU", $text, $matches);
	$text_neu = htmlspecialchars($matches[0]);
	$text = preg_replace("=\[code\](.*<.*>.*)\[/code\]=siU", $text_neu, $text);

Wenn jemand eine effizientere weiss, mit nur einem Preg_replace, wäre ich auch nicht abgeneigt.

Auch dieser Code birgt jedoch noch so seine Probleme in sich. Nämlich kann ich damit nur einen einzigen Code block parsen, wenn es jedoch zwei untereinander hat, geht es nicht. Wenn ich es mit preg_match_all mache, wüsste ich nicht, wie ich wüsste welcher code block angesprochen wird.

Vorschläge werden gerne angenommen..
 
Zuletzt bearbeitet:
Was stört dich an meiner Lösung?

Natürlich kannst du da auch ein htmlspecialchars mit einfügen, aber das wandelt AFAIK nicht die < und > um!:

Code:
function makecode($txt) {
  $txt = str_replace("<", "&lt;", $txt);
  $txt = str_replace(">", "&gt;", $txt);
  $txt = htmlspecialchars($txt);

  return $txt;
}

$text = preg_replace("=\[code\](*.)\[\/code\]=eisU", "makecode('$1')", $text);
 
Doch, tut es, denn sonst könnte der Quelltext nicht angezeigt werden :)

außerdem, warum sollte man sich eine funktion neuschreiben, wenn es sie schon längst gibt :-)

@prijv: ich habe dir eine 3-zeilenlösung geschrieben

$pattern = "/\[-code-\](.*)\[-code-\]/isU";
$replace = "<code>htmlspecialchars('\\1')<code>";
preg_replace($pattern,$replace,$text);

no time for testing, falls es klappt, gut, wenn nicht, dann nicht :p
 
@methodus: Das 'e' würde ich nicht weglassen, denn das sorgt ja dafür, dass die Funktion im zweiten Parameter von preg_replace aufgerufen wird :)

PHP:
$text = preg_replace("=\\[code\\](.*)\\[\\/code\\]=esiU","htmlspecialchars('\\$1')",$text);

So funktioniert's :)
 
Zurück