PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bestimmte zeichenfolgen in Strings ersetzen?



~Gh05t~
25-01-2003, 12:39
Hi,
ich bin gerade dabei ein Gästebuch zu schreiben und will HTML-Verbieten.
Stattdessen habe ich versucht einen eigenen Code einzubauen wie man ihn aus einigen Foren (wie auch diesem) kennt.
Diesen Code muss ich nur beim anzeigen wieder in HTML-Code übersetzen. Das ist weiter kein Problem, ich habe folgenden code mal als beispiel:


# $eingabe ist der string der den Eintrag entählt.
do{
$img_array = explode("",$eingabe);
$img_string = explode("",$img_array[1]);
$eingabe = str_replace("".$img_string[0]."","<img src=\"".$img_string[0]."\">",$eingabe);
} while(strstr($eingabe,"[img]"));

Das funktioniert aber leider nur solange, wie "img" klein geschrieben wurde. Wie muss ich den Code verändern, damit auch "Img", "iMg", "imG", "IMg", "iMG", "ImG" und "IMG" ersetzt wird?

mehlvogel
25-01-2003, 13:59
Die Schleife ist sinnlos, da alle Replace Funktionen in PHP den gesamten String parsen. Für Case sensitive musst du leider eregi_replace benutzen - obwohl diese langsamer ist.



eregi_replace("\[img\]([^\"]*)\[\/img\]", "<img src=\"\\1\">", $eingabe);


Das dürfte dein gesamtes Problem lösen. Zur Not musst du preg_replace benutzen, und zwar so:



preg_replace("/\[img]([^\"]*)\[\/img\]/siU", "<img src=\"\\1\" border=0>", $eingabe);


Das Filtert alle img - Tags aus deinem String raus.

~Gh05t~
25-01-2003, 14:44
moooment... das war einen schritt zu schnell. Hab ma bei php.net im manual geguckt was diese Funktion macht, und ich muss sagen ich kann deinen Code nicht ganz nachvollziehen. Dazu mus ich sagen das ich nicht besonders viel Ahnung davon habe :rolleyes:
Jedenfalls sacht mir mein script wenn ich es ausführe

Warning: Unknown modifier 'g' in /daten/home/gh05t/public_html/gb/index.php on line 1168


PS: Mein Code oben hat 1a funktioniert, ist zwar sicherlich zu umständlich aber keineswegs sinnlos (die schleife). Guck dir mein replace ma genau an. Da wir immer nur ein img-tag ersetzt. Wenn dann noch einer drin ist, wird die schleife noch mal durchlaufen.

mehlvogel
25-01-2003, 14:58
ja, war ein kleines Problem mit Backslashes



eregi_replace("\\[img\\]([^\"]*)\\[/img\\]",_"<img src=\"\\\1\">", $eingabe);


so, sollte das funktionieren...

~Gh05t~
25-01-2003, 15:16
Aber ich hab ne andere Lösung:

do{
preg_match("/\[img]([^\"]*)\[\/img\]/siU",$eingabe,$img_string);
$eingabe=str_replace($img_string[0],"<img src=\"".$img_string[1]."\" border=0>",$eingabe);
}while(stristr($eingabe,"[img]"));

Den Befehl hab ich bei php.net gefunden und gleich mal ausprobiert...
Was ist damit?

/edit: Das funced gut, nur wenn der string zwischen img und /img ein " steht gibts einen Fehler beim Laden des scripts... (Endlosschleife)

mehlvogel
25-01-2003, 20:42
Versuch mal den Regulären Ausdruck den du jetzt bei preg_match benutz in preg_replace also:



preg_replace("...", "<img src=\"\\\\1\">", $eingabe);


Dann kannst du auf die komplette Schleife verzichten. (Ich hoffe die Backslashes werden jetzt richtig übersetzt)

~Gh05t~
25-01-2003, 23:12
hmmm... nope, funced auch nit... macht einfach gar nichts.
Ich hab jetzt

preg_replace("/\[img]([^\"]*)\[\/img\]/siU","<img src=\"\\1\" border=0>",$eingabe);


PS: Schreib mir lösungen bitte mal in [ code ] tags, [ php ] macht ein paas backslashes weg...

mehlvogel
26-01-2003, 08:17
Okay. So wie ich es jetzt poste funkt es bei mir:



/* snip */

$searcharray[]="/\[img]([^\"]*)\[\/img\]/siU";
$replacearray[]="<img src=\"\\1\" border=0>";

/* somewhere later in the sourcekot */

$data = preg_replace($searcharray, $replacearray, $data);


(Wobei $data natürlich die Eingabe enthält)

~Gh05t~
26-01-2003, 11:43
Ok, das funktioniert! :)
Aber ich habe immer noch das Problem mit den Anführungszeichen (mit anderen vielleicht auch?)
Ich habe z.B. folgende Zeile:


$eingabe = preg_replace("/\[b]([^\"]*)\[\/b\]/siU","<b>\\1</b>",$eingabe);

Wenn ich jetzt einen Eintrag habe wie
[B ]"test"[ /b] wird dieser nicht interpretiert.
Hier hätte ich noch die Möglichkeit das so zu lösen, das ich die b und /b tags einzeln ersetze, also mit


$eingabe = preg_replace("/\[b]/siU","<b>",$eingabe);
$eingabe = preg_replace("/\[\/b]/siU","</b>",$eingabe);

Das hätte nur den Nachteil, das für den Rest meiner HTML-Ausgabe ein b-tag geöffnet wäre, wenn der Einträger den tag nicht mehr geschlossen hat.
Lässt sich das Problem irgendwie lösen?

PS: Damn, wozu hat man die Code und PHP tags, wenn sie doch nicht das ausgeben was sie sollen? :mad:

mehlvogel
26-01-2003, 22:40
probier den Regulären Ausdruck mal im preg_replace



/\[b](.*)\[\/b\]/siU