 |
02.03.2006, 22:01
| Nach oben
#1 | | Johannes Schlichenmaier
Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 395
| 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($str, true); $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).
|
| |
02.03.2006, 22:22
| Nach oben
#2 | | me pro ok?
Registriert seit: 07.09.2005 Ort: Pulheim bei Köln
Beiträge: 964
|
Keine Ahnung, bis Zeile 40 wird ja offensichtlich alles ordentlich escapet.
Schalt vielleicht mal magic_quotes_gpc aus, vielleicht hilft das.
|
| |
02.03.2006, 22:38
| Nach oben
#3 | | Johannes Schlichenmaier
Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 395
|
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
|
| |
02.03.2006, 22:43
| Nach oben
#4 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.482
|
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) > 0 && !$this->is_valid_function_array($callback_functions)) throw new Exception (__FILE__.":".__LINE__." : ".print_r($callback_functions, true)); 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).
|
| |
02.03.2006, 22:44
| Nach oben
#5 | | Johannes Schlichenmaier
Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 395
|
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
|
| |
02.03.2006, 22:48
| Nach oben
#6 | | me pro ok?
Registriert seit: 07.09.2005 Ort: Pulheim bei Köln
Beiträge: 964
|
// 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).
|
| |
02.03.2006, 22:55
| Nach oben
#7 | | Johannes Schlichenmaier
Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 395
|
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
|
| |
02.03.2006, 23:08
| Nach oben
#8 | | Johannes Schlichenmaier
Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 395
|
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).
|
| |
02.03.2006, 23:12
| Nach oben
#9 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.482
|
Ich musste da oben mal was ändern.
Im RegExp müssen in den [.php]-Tags natürlich die Punkte weg. |
| |
05.03.2006, 18:36
| Nach oben
#10 | | Johannes Schlichenmaier
Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 395
|
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
|
| | |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | | |
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. HTML-Code ist aus. | | | Alle Zeitangaben in WEZ +2. Es ist jetzt 09:08 Uhr.
|