Reguläre Ausdrücke und stripslashes

Danielku15

Erfahrenes Mitglied
Ich bins mal wieder.
Ich habe folgendes Problem.
Ich möchte mittels GeSHi Quellcodes highlighten. Die Codes werden aus meiner Datenbank ausgelesen und werden dadurch mit Slashes versehen.
Wenn ich den Code ohne Stripslashes anzeige sind logischerweise die ganzen Slashes vor den Anführungsstrichen noch vorhanden und der Highlighter arbeitet dementsprechend. Dann dachte ich mir entfernen wir die einfach mit stripslashes.
Gut die Slashes vor den Anführungsstrichen waren weg. Nur der Regex-Code der angezeigt werden sollte war ebenfalls verunstaltet. Die ganzen doppelten Slashes wurden entfernt.
Das selbe Problem ist bei der normalen highlight_string Funktion.
Gibts da eine Möglichkeit die Regulären Ausdrück trotzdem richtig darstellen zu lassen?

gruß Daniel
 
Ich nehme mal an, dass du die über die Werte in der DB ein [phpf]mysql_real_escape_string[/phpf] drüber schickst.
Wenn aber magic_quotes_gpc aktiviert ist werden dadurch "Slashes" doppelt angehängt.
Ich nutze z.B. diese Funktion um sicherzugehen, dass alles richtig läuft:
PHP:
function quote_smart($value) {
   
   if (get_magic_quotes_gpc()) {
       
	   $value = stripslashes($value);
	   
   }

   if (!is_int($value)) {
   
       $value = mysql_real_escape_string($value);
	   	   
   }

   return $value;
   
}
Ich hoffe das hilft.

greetz
daddz
 
Also. Jetzt mal der Reihe nach.

Der Wert der Funktion get_magic_quotes_gpc() ist auf 1. Den Quellcode habe ich als Text über den phpMyAdmin in die Datenbank eingetragen. Auslesen lasse ich sie über meine Datenbankklasse welche die Werte mit mysql_fetch_array fängt. Ich erkläre mal meine schrittweise Vorgehensweise.

Ich habe nun diesen Code in meiner Datenbank (Spalte: Text):

[code=php]
<?php
$text = preg_replace("/\\[b\\](.*)\\[\\/b\\]/s","<b>\\1</b>",$text);
?>
[/code]


Dann lasse isch den Code auslesen und über folgende Funktion parsen:

PHP:
<?php
function bbcode($string) {
    $string = preg_replace("/\\[php\\](.*)\\[\\/php\\]/sie", "highlight_code('\\1', 'php')", $string);
    return $string;
}
function highlight_code($source, $language) {
    $geshi =& new GeSHi($source, $language);
    $return = $geshi->parse_code();
    return $return;
}
?>

Aufruf der Funktion
PHP:
 <?php 
echo bbcode($content[0]['Text']); 
?>
$content ist ein 2 dimensionales Array. Im 1. Index steht die Nummer des des x. Datensatzes. Im 2.Index steht der Spaltenname der Tabelle.

Die Ausgabe ist folgende (ich hab die Farben in der Language-Datei verändert):
<?php

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

?>
Resultat
Wenn ich stripslashes in der BBCode Funktion hinzufüge, werden die doppelten Backslashes im RegEx Code zu einem Backslash reduziert. Die Backslashes vor den Anführungsstrichen bleiben erhalten.
Wenn ich stripslashes in der higlight_code Funktion hinzufüge werden die Backslashes vor den Anführungsstrichen entfernt und die doppelten Backslashes im RegEx Code.
Aber ich bekomme es bei bestem Willen nicht hin nur die Backslashes vor den Anführungsstrichen zu entfernen. Die Backslashes per vor den Anführungsstrichen kann ich jedoch auch nicht einfach per str_replace entfernen. Denn sollte ich einmal im Quellcode absichtlich einen Anführungsstrich escapen wird es ebenfalls entfernt.

Wenn ich die Funktion von daddz anstatt dem Stripslashes verwende, werden mir ebenfalls die \n und \r s angezeigt.

Oder hab ich da was falsch verstanden.

Ich hoffe ich hab nichts vergessen.
 
Ich hab die Option mal geändert. Hat keine Änderung gebracht. Ich habs auch schon auf meinem Webserver meines Hosters probiert. Dort ist das selbe Problem. Im Forum scheints auch zu funktionieren. Entweder liegt es am Auslesen selbst oder an der Verarbeitung. In der Datenbank steht ja 1zu1 der Code so wie er sein soll. Oder sollten bereits in der Datenbank die zusätzlichen Slashes eingetragen sein?
 
In der Datenbank selbst sollten die Daten in ihrer ursprünglichen Rohform gespeichert sein. Diese als Basis genommen, können die Daten schließlich beliebig formatiert werden.
 
Gut, dann stimmt wenigstens wie der Code gespeichert ist. Was für mich rätselhaft erscheint ist dass vor die Anführunsstriche Backslashes gesetzt werden jedoch nicht vor die anderen Backslashes und Slashes. Ich habe ein kleines Script außerhalb der Seite geschrieben und dort ebenfalls versucht eigenständig den Code zu highlighten. Dort tritt das selbe Problem auf. Hab ich was vergessen oder gar was zu viel gemacht? magic_quotes_gpc ist auf off.
Eigentlich mach ich doch nichts falsch:
PHP:
<?php
// Funktionen und Klassen einbinden //
require_once('hphilfe/inc/class_db.php');
require_once('hphilfe/inc/func.inc.php');
// Content holen //
$db = new db1();
$sql = "SELECT * FROM `content_inhalt` WHERE `ID`=1;";
$content = $db->db_sql($sql);
// Funktion zum zurückgeben des Codes an die Variable //
function return_code($source) {
    return $source;
}
// PHP Code rausfiltern //
$code = preg_replace("/\\[php\\](.*)\\[\\/php\\]/sie", "return_code('\\1')", $content[0]['Text']);
// Neues Objekt //
$geshi =& new GeSHi($code, 'php');
// Syntax higlighning per GeSHi //
echo "Code von GeSHi:<hr>";
echo $geshi->parse_code();
// Syntax Highlightning per highlight_string() //
echo "<hr><br>Code der PHP-Funktion:<hr>"; 
echo highlight_string($code);
?>
 
Zurück