WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   PHP: # escapen (http://www.wcm.at/forum/showthread.php?t=232785)

RaistlinMajere 08.01.2009 15:41

PHP: # escapen
 
ich übergebe an ein PHP-file einen string, in welchem sich u.a. ein # befindet.
dieses müßte vor der übergabe escaped werden, damit PHP alles danach nicht als kommentar interpretiert.

wie aber kann ich das machen, nachdem der HTML-code für # (&<hash>35; ) selbst wieder ein # enthält?

T.dot 08.01.2009 17:33

Servus,

was meinst du mit "ich übergebe an ein PHP-file einen string"? Als Request-Parameter, als Post-Wert, beim Einlesen eines Files?

Kann mir schwer vorstellen, wo es Probleme gibt, wenn in einem String ein # enthalten ist ('# ist doch auch nur ein String'), hast du nen Codeschnippsel?

mfg

ZombyKillah 08.01.2009 19:21

Wenn ich das richtig verstehe, wilst du eine '#' löschen.
Verstehe den Grund zwar nicht ... aber ich gehe jetzt einmal davon aus, dass du versuchst mit pearl oder bash eine Zeile aus einer Datei an eine php script zu geben, der irgendwas damit machen soll.

Eine liste der String befehle:
http://selfphp.edis.at/funktionsuebe...html#str_split

Du könnest z.B.: explode verwenden und dann mit der Anzahl der Arrayelemente kontrollieren, wieviele # es gegeben hat und ob es am Anfang der Zeile stand.

$str_arr=explode("#",$string);
if (count($str_arr) > 1 && ($str_arr[0]=="")){
unset($str_arr[0]);
$new_string = join("#",$str_arr);
unset($str_arr);

Weitere befehle ...

}

Keine Ahnung, ob der Code jetzt geht, hab das aus dem Kopf geschrieben ...
Aber so ca. könnte es aussehen ...
Mögliche fehler:
-Kontrolle, ob vor dem "#" nichts steht ...

reemrev 08.01.2009 22:41

Den String mit htmlentities codieren (z.B. für die DB), mit html_entity_decode decodieren, näheres hier: http://at2.php.net/htmlentities

RaistlinMajere 09.01.2009 12:23

ok, hier mal etwas genauer, was ich genau tun möchte:

ich möchte ein stück code, das aus einer DB ausgelesen wird und u.a. kommentare enthält (welche mit # gekennzeichnet sind), auf einer seite korrekt und nicht durch PHP interpretiert darstellen.
das funktioniert auch wunderbar mit htmlentities($code, ENT_QUOTES, 'UTF-8')

das problem ist nun, daß sich auf dieser seite ein link zu einem anderen PHP-script befindet, der code soll mit document.location="bla.php?param1=$param1&param2=$ param2&..." als übergabeparameter entsprechend übergeben werden, um dort dann wiederum dargestellt zu werden.

an und für sich sollte das mit htmlentities wieder kein problem sein. nur wenn ich dann auf der zielseite den parameter ausgeben lasse, fehlen leerzeilen sowie alles, was nach dem ersten # ist (weils offenbar als kommentar interpretiert wird).

das mit den leerzeilen habe ich so hinbekommen (obwohl das eigentlich doch durch htmlentities erledigt werden sollte, ist aber komischerweise nicht so):

$param1 = htmlentities(str_replace("\n","<br>",$code), ENT_QUOTES, 'UTF-8');

bei den # stehe ich hingegen immer noch an. :(
natürlich könnte ichs auch einfach über str_replace("#","<HASH>",$str) machen und <HASH> dann vor der ausgabe wieder zurückwandeln, aber da muß es doch eine professionellere lösung geben.

ZombyKillah 09.01.2009 18:12

Ich weiß nicht, wo du die Kommentare filterst, aber der htmlentities befehl wandelt nur alle Zeichen in html zeichen-code um.

So wird dein <br> auch in ein "&lt;br&gt;" umgewandelt, um die Symbole dann richtig darstellen zu können.

Nachdem du es aus einer DB ausließt, vermute ich, dass der Zeilenfilter bereits im query eingebaut ist oder seperat vorher behandelt wird.

Wilst du die Werte alle aus der DB auslesen und in den Link schreiben?
Oder steht z.B. in der Datenbank der Link mit allen Parameter in der gleichen Zeile?
Tschuldige, bin ein wenig verwirrt, weil du im Programmcode $param1 verwendest.
Ist dass eine ganze Zeile oder ist dass nur der $param1 vom Link?

Testcode:
$code = "#Zeile1 Kommentar
Zeile2 Programm
Zeile3 #";
echo htmlentities(str_replace("\n","<br>",$code), ENT_QUOTES, 'UTF-8');
echo str_replace("\n","<br>",htmlentities($code, ENT_QUOTES, 'UTF-8'));

zAPPEL 09.01.2009 18:41

Ist zwar nur eine Kleinigkeit aber ein nl2br($code) tut dasselbe wie dein str_replace(...) :) Und das Problem ist mir auch nicht ganz klar ;)

lg

T.dot 09.01.2009 19:05

Wärs nicht einfacher (falls möglich) den Wert, den du aus der Datenbank ausliest in eine Session-Variable zu geben und diese auf der nächsten Seite auszuwerten?
Dann sparst du dir das ganze escapen, ersetzten, usw.

edith:
Wenn du was per url-übergeben willst solltest du übrigens mit urlencode arbeiten.

PHP-Code:

<?php

if(isset($_REQUEST['param']))
{
    echo 
"param given: " urldecode($_REQUEST['param']);
}

$code "#Zeile1 Kommentar
Zeile2 Programm
Zeile3 #"
;

$url urlencode($code);

?>

<br /><br />
<a href="bla.php?param=<?php echo $url?>">klick</a>


RaistlinMajere 21.01.2009 12:41

danke für die hilfe, mit urlencode und decode hats geklappt. :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag