PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP-Datenspeicherung



dead_orc
27.08.2004, 21:40
Ich habe ein paar Fragen zu PHP:

1. Ich möchte mit PHP eine Datei schreiben, welche Zeilenumbrüche enthält. Wie kann ich es hinbekommen, dass wenn ich die Datei in Notepad bearbeite, diese Zeilenumbrüche auch angezeigt werden, da bisher bei mir dann alles in einer Zeile stand.
2. Gibt es eine Funktion, mit der ich aus einem \" ein " machen kann? Oder eine Funktion, die die Benutzereingabe " auch als " interpretiert und nicht als \" ?
Vielen Dank!

mitaki
27.08.2004, 21:47
1. Wenn du das Skript auf einem Windows Server ausführst musst du \r\n schreiben.
2. stripslashes; wenn du die Eingaben auch ausgeben möchtest solltest du die HTML Entitäten Maskieren htmlentities (" & etc).

dead_orc
27.08.2004, 22:18
Vielen Dank. Funktioniert bestens. Aber das ist mal wieder ein Beweis für die Kompliziertheit von Windows.
Ich hab gleich noch ne Frage: Wie kann ich in userangaben nach bestimmten Textstücken suchen und diese durch einen anderen Text ersetzen? (Man kann sich wohl schon denken, dass ich an einem Gästebuch sitze)

mitaki
27.08.2004, 23:05
Aber das ist mal wieder ein Beweis für die Kompliziertheit von Windows.Naja, Macs haben, soweit ich weis, auch was eigenes..


Wie kann ich in userangaben nach bestimmten Textstücken suchen und diese durch einen anderen Text ersetzen?Dazu verwendet man Reguläre Ausdrücke (Regex).
Dazu gibt es in PHP die erge(i)_*() und die preg_*() Funktionen. Allerdings werden heutzutage nur noch die preg Funktionen verwendet, da sie schneller und flexibler sind.

Beispiel (Ich habe keine php-Tags genommen, weil diese die Tags nicht anzeigen):
$text = preg_replace('#\[b\](.*)\[/b\]#Uis', '<b>$1</b>', $text );
Die Gatterzeichen trennen den Ausdruck von den Modifikatoren.
[ und ] müssen escaped werden.
() kennzeichnet einen bestimmten Bereich, hier den zwischen [B*] und [/B*], . (der Punkt) sagt, das es sich um ein Beliebiges Zeichen handeln kann, der * sagt, das beliebig viele beliebige Zeichen kommen dürfen.
Nach den Trennzeichen kommen die Modifikatoren.
U für Ungreedy (nicht gierig): Dieser Modifikator wird gesetzt, damit dieser String:
[B*] hallo [B*] lila [/B*] ku [/B*]durch
<b> hallo <b> lila </b> ku </b>ersetzt wird, anstatt durch
<b> hallo [B*] lila [/B*] ku </b>da ein 'gieriger' Audruck alles zwischen dem ersten und letztem [B*] bzw. [/B*] ignoriert.
i für case-insensitive: Wenn dieser Modifikator gesetzt ist, erkennt die Funktion [B*] als auch [b*].
s für [hm.. ka^^]: Damit erkennt der Punkt (belibiges zeichen) auch Zeilenumbrüche.

Der Ersatz: $0 steht für die Original Zeichenkette, $1 gibt den ersten Teilausdruck zurück, hier also was zwischen den B-Tags stand (Achtung, die $0 und $1 sind keine Variablen, d.h. du musst sie direkt in den Ersatz einbauen, nicht etwa '<b>' . $1 . '</b>').

Bei allen [B*] und [/B*] den Stern wegdenken, die sind nur da, um Fette Schrift zu vermeiden.

Das hört sich vielleicht kompliziert an, ist aber mit etwas Übung ganz einfach. Sieh dir am besten das Kapitel [b]XCV. Reguläre Ausdrücke Funktionen (Perl-kompatibel) (http://www.php.net/manual/de/ref.pcre.php) im PHP Manual an.

dead_orc
27.08.2004, 23:11
Danke nochmal (mist, ich hatte gehofft, ich könnte diese verdammten Regulären Ausdrücke meiden)
Von denen hab ich schonmal was gehört, aber es nie wirklich verstanden. Danke!

Jesus_666
29.08.2004, 15:51
Vielen Dank. Funktioniert bestens. Aber das ist mal wieder ein Beweis für die Kompliziertheit von Windows.
Vermutlich eher dafür, daß die meisten User nicht bedenken, daß Zeilenumbrüche auch Zeichen sind. Wenn du so was probierst...

echo "Dies ist eine Zeile.";
echo "Dies ist noch eine Zeile.";
...wirst du alles in einer Zeile bekommen. Der Grund: Du hast nicht angegeben, daß er Zeilenumbrüche ausgeben soll.
Unter Windows bestehen Zeilenumbrüche aus zwei Zeichen, Carriage Return und Line Feed (CR und LF; Escape-Zeichen \r und \n). Zeilen müssen unter Windows also mit CRLF terminiert werden.
Unix (und Linux) verwendet für Zeilenumbrüche nur LF; MacOS verwendet nur CR. Ich weiß nicht, ob OS X sich an die Unix- oder die MacOS-Konvention hält; es stammt von beidem ab.

BTW, PHP sollte unter Windows auch ohne \r komplette Zeilenumbrüche erzeugen. Glaube ich zumindest.


Zum Thema "Regexps": Yup, die sind schwer zu lernen. Dafür sind sie aber auch extrem mächtig und es ist immer eine Gute Sache, sie zu kennen.

dead_orc
29.08.2004, 16:49
@Jesus_666
Nein, nur ein \n ergibt (zumindest in notepad) keinen vollständigen Zeilenumbruch, sondern - gar nichts, weil man Escape-Zeichen ja nunmal meistens nicht sehen kann!
Ich wusste, dass man in verschiedenen OS verschiedene Zeilenumbruchcodes verwendet, aber ich hatte statt \r\n dummerweise \n\r versucht - und das geht ja nunmal nicht. Trotzdem danke euch beiden!

Ich finde nicht, dass Regular Expressions sehr schwer zu lernen sind (ich kann zwar wahrschienlich nicht alles, aber ne Menge!)

Jesus_666
29.08.2004, 19:14
Naja, es kommt immer darauf an, was du unter "lernen" verstehst. Es ist nicht besonders schwer, mit einer Referenz und Versuch-und-Fehler einen Stand zu erreichen, wo man kleinere Regexps aus dem Kopf heraus zusammensetzen kann. Bis man die ganz komplexen Dinger ohne Hilfe schreiben kann ist es dann aber immer noch ein weiter Weg. Und Regexps bestechen nicht gerade durch ihre Überschaubarkeit.

dead_orc
30.08.2004, 14:41
Ich habe nun noch eine letzte Frage (ich hoffe, dass es die letzte ist):
Wie kann ich das \r\n jetzt wieder aus den eingelesenen Daten entfernen? Geht das auch mit Regexp und wenn ja, wie? (Ok, ich kann sie doch noch nicht :\ )

Latency
30.08.2004, 14:46
nun \r ist mir unbekannt ich habe meine Zeilenumbrüche mit \n gemacht.

Trozdem gibts ne Funktion namens n2lbr (http://de.php.net/manual/en/function.nl2br.php) die diese \n durch ein <br /> ersetzt.

Allerdings ist dieser Code dann für XHTML gedacht, dh. du müsstest ihn unter umständen nochmal durch <br> ersetzen sofern du ein HTML4.0 Dokument schreibst.

dead_orc
30.08.2004, 14:53
Ich wollte ja nicht das \n in ein <br> umwandeln, sondern einfach in nichts, also entfernen ("").
Aber dabei ist mir was aufgefallen: Ich habe bisher gar nicht gemerkt, dass nl2br ein <br /> ausgibt. Ich dachte das wäre nur ein <br>. Also hab ich nachgeguckt und festgestellt, dass mir der HTML-Validator das <br /> in einem Nicht-XHTML-Dokument gar nicht anstreicht :eek: . Ist das normal bei Transitional?

mitaki
30.08.2004, 15:04
Ich frage mich, warum überhaupt noch jemand HTML4 schreibt, XHTML ist genau das selbe, und kein bisschen schwerer zu erlernen.
Von <br /> habe ich nch nicht gehört, dass es Probleme macht, anders sieht es da mit <meta /> in HTML Dokumenten aus, da springt der Validator an.

Mit preg_replace() kann man auch einfache ersetzungsarbeiten machen...
$text = preg_replace ( '#\n\r#', '', $text );Allerdings weis ich nicht, ob du dafür den s-Modifikator setzen musst, einfach mal testen.

dead_orc
30.08.2004, 15:36
*sich an den kopf haut*
Ich dachte mir, dass das "\" ja das Maskierungszeichen ist, und deshalb ja nicht auch für Escape-Zeichen verwendet werden kann. Naja, danke und §doof §pdumm