dedlfix: Neue Fragen

Beitrag lesen

echo $begrüßung;

Ich hoffe, es steht nirgends ein $begrüßung="Nicht schon wieder dieser dumme Brombeermilchtrinker"; *g*

Ich habe keine Ahnung, was du da auf dem System eingestellt hast, auf /mit dem du meine Postings liest ... :-)

Es ist nicht immer günstig, alles auf einmal und so wie es gerade anfällt zu programmieren. Eine klare Strukturierung und Trennung/Abgrenzung der einzelnen Teilaufgaben erhöht die Wartbarkeit bei komplexer werdenden Scripten.

Das klingt logisch, ja.

Die Magic Quotes haben mit der eigentlichen Aufgabe deines Script nichts weiter zu tun. Sie zu beseitigen ist nur notwendiges Übel. Deswegen empfahl ich, sie aus dem eigentlichen Scriptverlauf auszuklammern und unabhängig von allem anderen am Scriptanfang zu erledigen.

Meinst Du damit, ich soll gleich ganz oben auf der Seite die Variablen in Kombination mit den Magic Quotes holen?

Nein, ich meine, du sollst sie völlig unabhängig von deinem restlichen Script behandeln, so wie es das Example 31-2 macht. Das Feature Magic Quotes wird es ab PHP 6 nicht mehr geben und es ist auch jetzt schon auf manchen Systemen nicht mehr aktiviert. Ich sehe es nicht als sinnvoll an, die Bereinigungsmaßnahme mit dem restlichen Scriptverlauf zu verbinden. Deshalb Example 31-2 am Scriptanfang einbauen und im weiteren Verlauf davon ausgehen, dass $_GET, $_POST etc. frei von Magic Quotes sind.

Warum sollen sie nicht gespeichert werden? Wenn sie jemand in einem HTML-Code-Beispiel verwendet oder Dinge schreibt, die zufällig wie Tags aussehen, müssen sie nicht unbedingt verloren gehen. Du musst nur bei der Ausgabe darauf achten, dass sie mit htmlspecialchars() HTML-gerecht umgeschrieben werden. < als &lt;, > als &gt; und " als &quot; - erledigt der Fall. Es ist eine gute Idee, sich das htmlspecialchars() für die Ausgabe aller nicht direkt im Script notierten Daten anzugewöhnen.

OK, also nimm mal an, ich möchte sowas wie ein Blog machen. Da sollen alle Leser-Kommentare gleich aussehen und ich will nicht, daß jemand mit <font size="12"> oder Ähnlichem da Unruhe stiftet. Gibt also jemand als Wert zB " <font size="9" color="red">Hallo Welt</font> ein, dann soll bei der Ausgabe einfach nur "Hallo Welt" stehen. Das muß doch gehen, oder?

Das kann man so machen, und wenn du mit den Nebenwirkungen von strip_tags() leben kannst, kannst du das auch einsetzen.

Ich vertrete da eher eine andere Meinung. Wenn jemand <font size="12"> in seinem Text eingibt, egal ob er die Absicht hat, sich damit wichtig zu machen oder einfach nur darüber zu reden, so wie wir das grad tun, dann soll er das doch tun und dann auch genauso als reinen Text angezeigt bekommen. In einem Fall hat er Pech und seinen Text verunstaltet, im anderen muss er sich keine Verrenkung ausdenken, um doch noch irgendwie <font size="12"> schreiben zu können.

Auf der anderen Seite wiederum möchte ich, daß, wenn jemand einen Kommentar schreibt und da zB. www.meineseite.com vorkommt, dies bei der Ausgabe zu einem Link wird.

Du wirst das wesentlich einfacher haben, wenn du die bekannte BBCode-Syntax unterstützt. Da kann der Anwender selbst angeben, ob er einen Link haben möchte [url]www.example.com[/url] oder ob die Adresse unverlinkt stehen soll. [b][/b] und Konsorten können zur Formatierung verwendet werden. Und für BBCode weiß ich, dass es da bereits eine sehr gute Lösung gibt.

Nichts desto trotz war ich gestern natürlich nicht unfleißig und habe mich mal mit preg_replace() und mit ereg_replace() erstmalig beschäftigt. Schau Dir mal meine 2 Beispielseiten an :

Es gibt für PHP zwei RegExp-Maschinen, eine Posix- und eine Perl-kompatible (ereg* vs. preg*). Im Allgemeinen soll man die preg*-Funktionen nehmen, da diese schneller sind. Noch schneller sind bei einfachen Stringmanipulationen reine String-Funktionen (hier: str_replace()). So eignen sich deine ersten beiden Beispiele zwar zum Üben, aber nicht als gutes Beispiel für eine sinnvolle RegExp-Anwendung.

$suchmuster='(^| )(www([-]*[.]?[a-zA-Z0-9_/-?&%])*)';
$ersatz='<a href="http://\2">\2</a>';
Es funktioniert, ich hab aber keine Ahnung, wieso und wie der reguläre Ausdruck in der Anweisung zu deuten ist.

Die runden Klammern gruppieren. Sie fassen einen Teil zusammen, vor allem um ihn später im Ersetzungsausdruck einfügen zu können. In $ersatz weist das \2 an, den zweiten geklammerten Ausdruck zu verwenden.

(^| )
Gesucht wird der Text-Anfang ^ oder | ein Leerzeichen. (Man muss bei geklammerten URLs plenken, da ein www nur erkannt wird, wenn es am Anfang oder nach einem Leerzeichen steht. Dieses Problem hätte man mit BBCode nicht.)
www
steht für sich selbst.
[-]
steht für einen Bindestrich. Man hat ihn wahrscheinlich mangels besseren Wissens in eine Zeichenklasse [] getan. Er hätte auch einfach so dastehen können.
Eine Zeichenklasse fasst mehrere Zeichen zusammen. Sie listet alle Zeichen auf, die an dieser Stelle vorkommen können.
*
steht für: Das vorhergehende Zeichen (oder auch eine Gruppe, hier: alle Zeichen der Zeichenklasse [-]) darf wegbleiben oder beliebig oft auftreten (0 oder mehr).
[.]
Dann kommt ein Punkt. Da ein Punkt für ein beliebiges Zeichen steht, hat kan ihn hier wieder in eine Zeichenklasse getan, wo er diese Bedeutung verliert. Das hätte auch ein vorangestellter \ getan.
?
steht für: gar nicht oder höchstens einmal.
[a-zA-Z0-9_/-?&%]
Hier ist die Zeichenklasse mal sinnvoll angewendet, auch wenn sie einen Fehler enthält. Der Bindestrich steht für einen Bereich, a-z also für alle kleinen Buchstaben des lateinischen Alphabets. Will man den Bindestrich als solchen haben, muss er als erstes oder letztes Zeichen der Zeichenklasse notiert sein. Das /-? steht also nicht nur für diese drei Zeichen sondern für /0123456789:;<=>?

Das sollte keine Einführung in Reguläre Ausdrücke werden. Einige Besonderheiten der erwähnten Regeln habe ich deshalb nicht genannt. SELFHTML hat im Perl-Teil ein Kapitel zu Regulären Ausdrücken.

echo "$verabschiedung $name";