Portal > Foren > PHP > PHP-Programmierung > Problem mit highlight_string() - falsches Escapen
Antwort
 
Themen-Optionen
Alt 02.03.2006, 22:01 Nach oben    #1
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 395
Standard Problem mit highlight_string() - falsches Escapen

Hallo.
Ich baste grade an einem BBCode-Parser und bin auch schon recht weit.
Allerdings jetzt komme ich nicht mehr weiter.
Und zwar gehts weniger um den Parser, als viel mehr um die Möglichkeit, PHP-Code mit der Funktion highlight_string() farbig aufzubereiten.

Mein Problem: die Funktion escapet anscheinend irgendwie falsch.
Die Funktion ist:
PHP-Code:
function highlight($str) {
    
$rows = array();
    
$str highlight_string($strtrue);
    
$str_array explode("<br />"$str);
    
$i 1;
    foreach (
$str_array as $row) {
        
$rows[] = '<font color="#808080">'.$i."</font>\t".$row;
        
$i++;
    }
    
$str implode("<br />"$rows);
    return 
$str;

Den String bekomme ich durch Auslesen. ( fread() ).
Das ganze könnt ihr euch hier angucken:
http://h679879.serverkompetenz.net/l...06.de/Test.php

Dort findet ihr auch die Datei Test.php und den BBParser.

Natürlich könnt ihr die Klasse auch verwenden. Denn eigentlich funktioniert sie ganz gut, bis auf die Tatsache, dass noch keine Vermeidung von invalidem HTML-Code gibt ("[ b ][ u ][ /b ][ /u ]" ist möglich) und die Möglichkeit fehlt, dass bestimmter Code nicht mehr geparst wird.
Wenn ihr wollt, könnt ihr es auch um diese Funktionen erweitern, obwohl ich das ja selbst vor habe.

Aber in erster Linie geht es mri um die o.g. Funktion. Hättet ihr eine Idee, was daran falsch ist.
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int

Geändert von Jojo (02.03.2006 um 22:07 Uhr).
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 22:22 Nach oben    #2
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Keine Ahnung, bis Zeile 40 wird ja offensichtlich alles ordentlich escapet.

Schalt vielleicht mal magic_quotes_gpc aus, vielleicht hilft das.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 22:38 Nach oben    #3
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 395
Standard

Schafft dem leider keine Abhilfe ...
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 22:43 Nach oben    #4
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.482
Standard

Wir hatten doch gestern kurz in die Klasse geschaut. Da funktionierte das einwandfrei. Irgendwas musst Du dann ja danach geändert haben!

Geh mal Schritt für Schritt zurück.

Grüße Ben.

EDIT:
Damit man nicht immer auf die Seite da drauf muss:
PHP-Code:
<?php
/**
 * BBParser
 * parst Code auf konfigurierbare BBCode-Tags
 * 
 * @author Johannes Schlichenmaier
 * @version 01.03.2006
 * @package core_util
 */
 
 
class core_util_BBParser {
     private 
$tags = array('search' => array(), 'replace' => array());
     
     
/**
      * core_util_BBParser::construct($custom = false)
      * Erstellt auf Wunsch häufige BBCode-Tags automatisch. Wenn nicht erwünscht, einfach mit "true" als Parameter aufrufen.
      * 
      * @param boolean $custom     Wenn "true" gesetzt, werden b, i , u, und zwei Varianten von Links (link - [url=...]...[/url] - 
      *                             und url - [url]...[/url]- ) nicht erstellt.
      */
     
public function __construct($custom false) {
         if (
$custom === false) {
             
$this->add_Tag('b''[b]%b[/b]''<b>%b</b>');
             
$this->add_Tag('i''[i]%i[/i]''<i>%i</i>');
             
$this->add_Tag('u''[u]%u[/u]''<u>%u</u>');
             
$this->add_Tag('link''[url=%s]%l[/url]''<a href="%s">%l</a>');
             
$this->add_Tag('url''[url]%s[/url]''<a href="%s">%s</a>');    
         }
     }
     
     
     
/**
      * core_util_BBParser::prepare_Pattern($string)
      * wandelt einen BBCode zu einem Regulären Ausdruck um
      * 
      * @param String $string    umzuwandelnder String
      */
     
private function prepare_Pattern($string) {
         
$string addcslashes($string,'\'\\/,^$.[]|()?*+{}');
         
$string preg_replace("/%[a-z]/""(.*)"$string);
         
$string '/'.$string.'/isUe';
         return 
$string;
     }
     
     
     
/**
      * core_util_BBParser::prepare_html_Output($string, $placeholders)
      * bereitet den Ã¼bergebenen HTML-Code mit den Platzhaltern für die Verwendung in preg_replace vor
      * 
      * @param String $string    umzuwandelnder HTML-Code
      * @param Array $placeholders    Array mit in dem BBCode gefundenen Platzhaltern in der Reihenfolge ihres Auftretens
      */
     
private function prepare_html_Output($string$placeholders) {
         
$i 0;
         
//$string = str_replace("'", "\'", $string);
         
$string str_replace(array("'""%\'"), array("\'""'"), $string);
         
$string "'".$string."'";
         foreach (
$placeholders as $index => $plc) {
             if (
$plc !== null) {
             
$string str_replace($index"'.".$plc."('\$".($i+1)."').'"$string);
             }
             else {
             
$string str_replace($index"\$".($i+1), $string);
             }
             
$i++;
         }
         return 
$string;
     }
     
     
     
/**
      * core_util_BBParser::is_valid_function_array(&$name)
      * Ãœberprüft, ob ein Ã¼bergebenes Array mit Platzhaltern gültige Funktionen/Methoden enthält
      * 
      * @param &Array $name     Array mit Platzhaltern (und zusätzlichen Informationen)
      */
     
private function is_valid_function_array(&$name) {
         
$all_valid true;
         foreach (
$name as $plc => $function) {
             
$valid true;
             if (
preg_match("/^%[a-z]/"$plc)) {
                 if (
stristr($function'$this->') !== false) {
                     
$function_array explode('->'$function);
                     if (!
is_callable(array($this$function_array[1]))) $valid false;    
                 } 
                 elseif (
strstr($function'::') !== false) {
                     
$function_array explode('::'$function);
                     if (!
is_callable(array("$function_array[0]"$function_array[1]))) $valid false;
                 }
                 else {
                     if (!
function_exists($function)) $valid false;
                 }
                 if (!
$valid) {
                     
$all_valid false;
                     
$name[$plc] = $name[$plc].' - ERROR: method/function is not callable';
                 }
             }
         }
         
         return 
$all_valid;
     }
     
     
     
/**
      * core_util_BBParser::add_Tag($name, $bbcode, $htmlcode, $callback_functions = array())
      * Fügt einen weiteren BBCode-Tag zum Suchalgorithmus hinzu
      * 
      * Platzhalter: ein % mit anschließendem a-z.
      * Besondere Platzhalter:     %s : Darin gefundene Strings werden nicht weiter geparst - NOCH NICHT IMPLEMENTIERT
      *                             %' : Wird im preg_replace später zu einem unescapten ' . Nützlich, um einzelne Platzhalter direkt durch Funktionen oder Methoden zu schicken.
      * 
      * @param String $name    Identifier des neuen Tags
      * @param String $bbcode    BBCode mit Platzhaltern
      * @param String $htmlcode    HTML-Code mit Platzhaltern - 
      *                             nur %' wird später zu ' so können auch direkt Funktionen auf einzelne Platzhalter Ã¼bergeben werden
      * @param Array $callback_functions    Enthält Informationen zum Tag und für einzelne Platzhalter Funktionen 'Platzhalter' => Funktion/Methode
      */
     
public function add_Tag($name$bbcode$htmlcode$callback_functions = array()) {
         
$placeholders = array();
         
$place_holders = array();
         if (
count($callback_functions) > && !$this->is_valid_function_array($callback_functions))
             throw new 
Exception (__FILE__.":".__LINE__."  :  ".print_r($callback_functionstrue));
             
          
preg_match_all("/%[a-z]/"$bbcode$place_holders);
         foreach (
$place_holders[0] as $plc) {
             
$placeholders[$plc]    = (isset($callback_functions[$plc])) ? $callback_functions[$plc] : null;
         }
         
$this->tags['search'][$name]  = $this->prepare_Pattern($bbcode);
         
$this->tags['replace'][$name] = $this->prepare_html_Output($htmlcode$placeholders);
     }
     
     
     
/**
      * core_util_BBParser::parse($code)
      * Parst Ã¼bergebenen Code nach den vorher definierten Tags
      * 
      * @param String $code zu parsender Code
      */
     
public function parse($code) {
         return 
preg_replace($this->tags['search'], $this->tags['replace'], $code);
     }
 }
?>
Das ist die Klasse. Wer weiß .. vielleicht liegt es auch irgendwie an der Stelle in der Klasse? Wüsste nicht genau warum .. aber .. .. wer weiß ...


EDIT:
Durch
Zitat:
Mittlerweile habe ich auch "rausgefunden", dass das Problem daran liegen muss, was mein Parser mit dem String macht, nicht an der Funktion.
Ist
Zitat:
Wer weiß .. vielleicht liegt es auch irgendwie an der Stelle in der Klasse?
dann auch geklärt .

Geändert von Ben (02.03.2006 um 22:46 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 22:44 Nach oben    #5
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 395
Standard

Mittlerweile habe ich auch "rausgefunden", dass das Problem daran liegen muss, was mein Parser mit dem String macht, nicht an der Funktion.
Ich such mal weiter, vielleicht findet ihr ja was ich falsch mache.
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 22:48 Nach oben    #6
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

// edit:
Hab wieder nicht die ganze Funktion gelesen, mir ist aufgefallen, dass da ein RegExp escapet wird

// edit zwo:
PHP-Code:
     private function prepare_html_Output($string$placeholders) {
         
$i 0;
         
//$string = str_replace("'", "\'", $string);
         
$string str_replace(array("'""%\'"), array("\'""'"), $string);
         
// [...]
     

Beim zweiten str_replace() kann ich in dem Prozentzeichen keinen Sinn erkennen, vielleicht Tippfehler?

Geändert von Lars (02.03.2006 um 22:51 Uhr).
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 22:55 Nach oben    #7
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 395
Standard

Also das mit RegExp is ja das Problem. Er escaped irgendwie alle " (Vielleicht sage ich ihm das sogar irgendwo, aber ich finds irgendwie nicht)

Das zweite mit dem % ist schon so gewollt, nur ist das ein wenig schwer zu erklären.
Sagen wir, es ist für komplizierterere Algorythmen.
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 23:08 Nach oben    #8
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 395
Standard

Sorry für Doppelpost, aber ich denke, es ist wirklich etwas neues:

Update:
mit folgendem add_Tag funktioniert es:
PHP-Code:
$parser->add_Tag('php''[.php]%s[./php]''<div class="php">%\'.highlight(str_replace(%\'\"%\', %\'"%\', %\'.%s.%\')).%\'</div>'); 
@Lars dafür sind die Dinger da

//edit: Hat trotzdem jemand ne Idee, welchen Fehler ich bei der Parser-Klasse mache?
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int

Geändert von Jojo (03.03.2006 um 01:23 Uhr).
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2006, 23:12 Nach oben    #9
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.482
Standard

Ich musste da oben mal was ändern.
Im RegExp müssen in den [.php]-Tags natürlich die Punkte weg.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.03.2006, 18:36 Nach oben    #10
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 395
Standard

So, obwohl ich das Problem mit den \" nicht anders lösen konnte, als den str_replace Standardmäßig aufzunehmen, war ich trotzdem nicht faul, sondern hab meinen Parser in sofern erweitert, dass er nun auch für öffentliche Dinge taugt, sprich, es wird kein invalider HTML-Code riskiert, da der Parser sowas verhindert.

Viel Spaß denen, die damit arbeiten wollen.
Bei Fragen und Problemen, nicht zögern, zu fragen.
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem E-Mails zu senden Jann Hendrik Plauderecke 7 25.05.2007 21:37
Problem mit zu vielen MySQL-Querys / Grundkonzeption Chr!s PHP-Programmierung 13 27.08.2006 16:59
Logisches Problem beim einsatz von Ereignissen Prophet Allgemeine Java-Programmierung 19 05.06.2006 22:08
Problem mit Cookie und Reloads... Bookworm PHP-Programmierung 10 13.04.2006 12:09
OSX + Eclipse 3.1 Problem bacarni Eclipse 3 29.07.2005 21:19


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:08 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44