Die dritte Lektion: Strings und Arrays

tempa wrote this 13:25:

Die Variablentype String (auf deutsch: Zeichenkette) haben wir bereits kennengelernt und eingesetzt. Schauen wir uns den Variablentyp jetzt etwas genauer an. Strings werden mit Anführungszeichen eingeleitet. Doppelte Anführungszeichen werden auf PHP-Code in der Zeichenkette (string) hin untersucht. In Zeichenketten können Variablen und Anweisungen vorkommen. Wenn Steuerzeichen in einer Zeichenkette vorkommen, die als Zeichen interpretiert und nicht als Steuerzeichen, dann muss das Zeichen mit einem Gegenschrägstrich (backslash) maskiert werden, andere Zeichen werden als Zeichen interpretiert und damit sie als Steuerzeichen erkannt werden müssen sie mit einem Gegenstrich (Backslash) maskiert (escaped) werden. In der folgenden Tabelle ist eine Liste der Steuerzeichen.

Spezielle Steuerzeichen / Sonderzeichen
Code Erläuterung
\n Neue Zeile Linefeed (LF, 0x0A)
\r Absatz Carriage return (CR, 0x0D)
\t Horizontaler Tab (HT, 0x09)
\\ Gegenstrich (Backslash) schreiben
\$ Dollar schreiben statt Variable interpretieren
\" Anführungszeichen schreiben statt Zeichenkette zu beenden

Für unseren aktuellen Stand ist die Liste erst einmal ausreichend, die vollständige Liste findet ihr unter Variablentypen: String

Strings können auch von einzelnen Anführungszeichen, Hochkommatas, umschlossen werden, dann werden Sonderzeichen mit Ausname der Maskierungen des Gegenschrägstrichs (\\) und dem Hochkommata (\') und Variablen nicht interpretiert. Variablen werden bei einzelnen Hochkommatas in Zeichenketten über einen Punkt zwischen zwei durch Hochkommatas abgeschlossene Zeichenketten eingefügt. Achten Sie auf die Anführungszeichen, Gegenschrägstriche und Punkte, die Ausgabe ist in den grünen Kommentaren der echo-Anweisung nachgestellt.

  1. $var = "Anna";
  2. echo "Hier betreut Sie $var."; // Hier betreut Sie Anna.
  3. echo "Hier betreut Sie \$var."; // Hier betreut Sie $var.
  4. echo 'Hier betreut Sie '.$var.'.'; // Hier betreut sie Anna.
  5. echo 'Hier betreut Sie $var.'; // Hier betreut Sie $var.
  6. echo 'Darstellung in \'\' von \\\' durch \\\\\\\'';
    // Darstellung in '' von \' durch \\\''

Ein Gegenschrägstrich (Backslash „\„) in Hochkommata (single Quotes) muss nicht notwendiger Weise in allen Fällen maskiert werden, wenn aber Ausgegeben werden soll, wie man Hochkommatas maskiert in Hochkommata mit echo, dann kann das zu exzessivem Maskieren von Gegenschrägstrichen und dem Hochkommata führen. Es bedarf sieben Gegenschrägstriche und ein Hochkommata um \\\' in Hochkommata zu schreiben, für jeden der drei Gegenschrägstriche einen Maskierungs-Gegenschrägstrich und einen Maskierungs-Gegenschrägstrich für das Hochkommata.

In dem nachfolgenden Codeblock sind zwei nützliche Dinge mehrzeilige Kommentare zum ein und ausblenden von Funktionen im Script und die mehrzeilige String-Variable:

  1. // Kommentartrick zum temporären Auskommentieren
  2. /**
    /
    // Mehrzeiliger Kommentar:
    echo <<<VARNAME
    Diese echo-Anweisung ist auskommentiert und alles was es braucht, die echo-Anweisung wieder scharf zu schalten, ist die einzelnen Schrägstriche am Anfang und am Ende in eine Zeile wie folgt /**/ zu nehmen. In der Entwicklungsphase eines Scripts ist das sehr nützlich.
    VARNAME;
    /
    **/

Der mehrzeilige Kommentar ist nicht nur um im Kopf des Skriptes für Metatext zum Skript geeignet, sondern auch um schnell Codeteile zu deaktivieren und aktiveren, z.B. um in der Entwicklungsphase Variationen zu testen oder Fehlerquellen zu identifizieren und eliminieren. (mehr …)

Linktipps String-Funktionen & Emailadressen vernebeln

tempa wrote this 21:47:

 
Linktipps:

  1. Eine schöne, praktische und verständliche
    Stringfunktionen-Übersicht auf HTML bis PHP: String-Funktionen.
  2. Die besten E-Mail-Vernebelungstechniken: Best Method for Email Obfuscation?

Zu 2.: Mein Favorit ist die ROT13-Javascript-Version. Aber, ohje, reines Javascript ist böse. Wir wollen also das <noscript> nicht vergessen, wenn auch das String Reverse mit CSS kaum als Barrierearm gelten kann, aber wenigsten wer Javascriptfrei surft, bekommt eine E-Mail-Adresse zu lesen.

Aus manfred.mustermann@wegwerf-emails.de wird via ROT13 encoder znaserq.zhfgreznaa@jrtjres-rznvyf.qr. Javascript decodiert den Buchstabensalat wieder:

  1. <script>
  2. document.write("<n uers=\"znvygb:znaserq.zhfgreznaa@jrtjres-rznvyf.qr\" ery=\"absbyybj\">Fraq n zrffntr</n>".replace(/[a-zA-Z]/g,
  3. function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);}));
  4. </script>

Mit der PHP Funktion strrev

  1. <?= strrev('manfred.mustermann@wegwerf-emails.de'); ?>

kehrt man die E-Mailadresse für den <noscript>-Tag um:
ed.sliame-frewgew@nnamretsum.derfnam
und die umgekehrte E-Mailadresse wird über CSS

  1. .obfuscate {unicode-bidi: bidi-override; direction: rtl;}

wieder zu: ed.sliame-frewgew@nnamretsum.derfnam. Nur mit dem Copy&Paste der E-Mailadress im <noscript> ... </noscript> wird’s nix mehr.

Die zweite PHP-Lektion: Rechnen mit Zahlen und das Datumsformat

tempa wrote this 12:12:

Um sich noch etwas mehr mit dem Datum und Variablen austoben zu können, z.B. im Dezember mit schönen Sprüchen einen Adventskalender zu produzieren oder etwas aktueller für den kommenden Sommer Freizeittipps zu geben.

Rekapitulieren wir noch mal. „Variablen deklarieren“ geht wie folgt. Eine Variable wird mit dem $-Zeichen eingeleitet, dem der Unterstrich oder ein Buchstabe folgt. Eine Zahl darf nicht direkt nach dem Dollarzeichen stehen, dazwischen muss schon noch ein Unterstrich oder einem Buchstaben stehen. Ein Variablenname kann Zahlen enthalten, aber __nicht__ direkt dem $-Zeichen gefolgt. $XYZ123 ist zulässig, $123XYZ ist nicht zulässig. Ebenfalls unzulässig ist ein Bindestrich bzw. Minuszeichen. Das Minuszeichen ist ein Operator und führt im Variablennamen zum Syntaxfehler.

Schaut man in die PHP-Dokumentation, begegnen uns unter anderen folgende Variablentypen:

  • Wahrheitswert: (bool), (boolean) – nach boolean
  • Ganzzahl: (int), (integer) – nach integer
  • Fließkommazahl: (float), (double), (real) – nach float
  • Zeichenkette: (string) – nach string

Die restlichen Variablentypen stellen wir hinten an für spätere Exkursionen in PHP.

Ganzzahlen werden positiv oder negativ geschrieben, Ganzzahlen sind nicht gesondert markiert. Um eine Zahl in eine Variable zu speichern, wird die Zahl ohne Zusatznotationen zwischen dem Gleichheitszeichen und Semikolon geschrieben:

$ganzzahl = 10; bzw. $ganzzahl = -10;

PHP rechnet in den meisten Fällen im Dezimalsystem, muss aber nicht. Stellt man der 10 eine 0 voran so wird daraus die oktale 8 und 0x vorangestellt ergibt hexadezimal 16.

  1. $a = 10; // dezimal 10
  2. $b = 0x10; // hexadezimal: 16
  3. $c = 010; // octal: 8
  4. $d = $a + $b + $c;
  5. var_dump($a); // (int)10
  6. var_dump($b); // (int)16
  7. var_dump($c); // (int)8
  8. var_dump($d); // (int)34

PHP rechnet mit den verschiedenen Formaten im bunten Kompott problemlos, am Ende wird ein Dezimalwert ausgegeben. Im Kommentar (mit doppelten Schrägstrichen eingeleitet) ist das Format und der Wert in den Zeilen 1 bis 3 angegeben. Übrigens Kommentare mit vorangestellten Doppelschrägstrich sind einzeilig und helfen den Code verstehen. Für den Augenblick sind die Codes überkommentiert, da sehr viel noch erklärt werden muss. Mehrzeilige Kommentare werden mit Schrägstrich und Stern /* Kommentar */ umklammert.

Weiter geht es – Rechnen mit Fließkomma (floats):

  1. $a = 10; // integer
  2. $b = 0.5; // float
  3. $c = $a*$b;
  4. var_dump($a); // (int)10
  5. var_dump($b); // float(0.5)
  6. var_dump($c); // float(5)

Obwohl PHP mit echo $c; 5 und nicht 5.0 ausgibt, also Ganzzahl nach dem Erscheinungsbild, wird die 5 als Fließkommazahl registriert. Achtung: PHP verwendet englische Konventionen. Kommastellen werden mit einem Punkt statt eines Kommas dargestellt.

Das Zahlenformat lässt sich den jeweiligen nationalen Konventionen mit number_format($Fließkommazahl = 1.5, $Dezimalstellen = 0 , $Dezimaltrennzeichen = ',' , $Tausendertrennung = '\'') anpassen.

(mehr …)

Yet another Regular Expression Rundschau

tempa wrote this 01:10:

Ein regulärer Ausdruck setzt sich wie folgt zusammen: Delimiter Suchmuster Delimiter Modifier, wobei Delimiter oblogatorisch und Modifier optional sind.

  1. $FundstellenArray = preg_match(/Suchmuster/i,$suchtext)
  • Delimiter: „/“ // ebenso mögliche Delimiter # ~ @ !
  • Suchmuster: „Suchmuster“ // nach Begriff suchen
  • Modifier: „i“ // Groß- und Kleinschreibung ignorieren

Taucht ein Delimiter innerhalb des Suchstrings auf, muss dieser mit einem Backslash escaped werden oder ein anderer Delimiter gewählt werden. Fehlt hier die Kontrolle über das Suchmuster, kann die Aufgabe Metazeichen zu escapen automatiert werden.

  1. /\QSuchmuster\E/

Alles zwischen \Q und \E ist Teil des Suchmusters ohne Metazeichen. Metazeichen werden so verwendet wie sie sind ohne deren Funktionalität. Alternativ kann auch die Funktion preg_quote() genutzt werden.

  1. $suchmuster_quoted = preg_quote($suchmuster,$delimiter);
Zeichenauswahl
Code Erläuterung
Muster Entsprechung wie im “Muster”-String
^Muster Entsprechung des “Muster”-Strings am Anfang des Strings Achtung! Zirumflex direkt nach geöffneter eckiger Klammer ändert die Bedeutung!
^Muster$ Alleinstehender “Muster”-String
Muster$ Entsprechung des “Muster”-Strings am Ende des Strings.
[bdf] eines der Zeichen “b”, “d”, “f”
[0-6] eine Ziffer von “0” bis “6” Mit dem Bindestrich wird ein Bereich definiert
[A-Za-z0-9] beliebige lateinische Buchstaben oder beliebige Ziffern
[^a] beliebiges Zeichen außer “a” “^” vor Zeichen in eckigen Klammern negiert selbige
[-A-Z], [A-Z-] bzw. [A-Z\-a-z] Auswahl enthält auch den Bindestrich “-”, wenn er das erste oder das letzte Zeichen in der Aufzählung einer Zeichenklasse ist
. Der Punkt steht für ein beliebiges Zeichen außer einem Zeilenwechsel.
Eckige Klammern definieren eine Zeichenauswahl, das Zirkumflex “^” an erster Stelle negiert die Auswahl, das Zirkumflex innerhalb der Auswahl oder am Ende ist literal zu verstehen, ein Bindestrich “-” am erster oder letzter Stelle in der Klammer ist literal zu verstehen, innerhalb beschreibt es einen Bereich von … bis. Alle anderen Metazeichen in der Klammer werden literal verstanden und als zu Suchendes eingeordnet. In der eckigen Klammer verlieren sie ihre Funktion im regulären Ausdruck.

Runde Klammern fassen logische Gruppen zusammen. Der reguläre Ausdruck #Muster(knabe|haus|gatte.)# findet den Musterknabe, das Musterhaus und den Mustergatten, der Musterartikel hingegen trifft nicht auf das Suchmuster zu. ~“artikel” ist keine erlaubte Alternative in der Suchuntergruppe.

(mehr …)

EGPCS-Variablen waschen und desinfizieren

tempa wrote this 09:38:

Allem, was von außen kommt, misstraut der Programmierer mit gutem Grund. Was von außen kommt, wird gereinigt, desinfiziert und vom Türsteher nur durchgelassen, wenn die Variable den Whitelist-Pass passiert. Was muss zum Türsteher? Die EGPCS-Variablen (Environment, GET, POST, Cookie, Server), die Superglobals:

  • $_ENV
  • $_GET
  • $_POST
  • $_REQUEST
  • $_COOKIE
  • $_SERVER
  • $_SESSION

Seit PHP5 gibt es zur Absicherung der Superglobals die Filterfunktionen, u.a. filter_input_array, mit dem man gleich eine Sammlung, wie man sie in einem Formular vorfindet, bereinigen kann. Dazu sollte man auch noch die Übersicht der Sanitize filters kennen. Die PHP Dokumentation hat es versäumt Querverweise auf den Seiten bereitzustellen oder es verständlich mit Anwendungsbeispielen zu dokumentieren (Ein PHP-Doku-Klassiker).

Eine gute, gebrauchstaugliche Hilfe für die Filterfunktion habe ich auf jqueryandphp.com gefunden: Before I get started… (aka – Always Sanitize Your User Input!)

So sieht das z.B. aus – das Formular mit den zu säubernden Formularfeld-Eingaben:

  1. <form action="adduser.php" method="post">
  2. Vorname: <input type="text" name="vorname" /><br/>
  3. E-mail: <input type="text" name="email" /><br/>
  4. Alter: <input type="text" name="alter" /><br/>
  5. <input type="submit" value="Add User" />
  6. </form>

und der Filterdurchlauf der Formularfeld-Eingaben mittels Array:

  1. $filter = array(
  2. 'vorname' => FILTER_SANITIZE_STRING,
  3. 'alter' => array(
  4. 'zahlenformat' => FILTER_VALIDATE_INT,
  5. 'altersvorgabe' => array('mindestalter' => 18)
  6. ),
  7. 'email' => FILTER_VALIDATE_EMAIL
  8. );
  9. $_FILTERAUSZUG = filter_input_array(INPUT_POST, $filter);

Das funktioniert auch mit den anderen Superglobals. Aber Achtung – wer das einsetzt, sollte sicher stellen, dass die PHP-Umgebung die entsprechenden Voraussetzungen erfüllt, denn wenn nicht, ist man mit dem guten alten preg_match, siehe PHP-Infektionen und anderen Unfug via $_GET und htmlspecialchars, besser bedient und das arbeitet in ähnlicher Weise wie die Filter.

Die erste PHP-Lektion

tempa wrote this 00:06:

PHP Tutorials langweilen ihre Leser in der Regel mit den ewig gleichen Beispielen, die in der echten Welt nur selten Sinn machen. Angefangen mit folgender PHP Anweisung:

  1. <?php echo "Hallo Welt"; ?>

Beginnen wir mit der Frage „Was ist PHP?“ bevor wir auf die Anweisung näher eingehen. PHP stand ursprünglich für „Personal Home Page Tools“ und heutzutage für „PHP: Hypertext Preprocessor“. Für alle die mit Hypertext nichts anfangen können. Hypertext im Internet ist die beschreibende Sprache, die der Maschine erklärt, wo in der Hirarchie der Text steht, bzw. welche Aufgabe der Text erfüllt. Hypertext gibt z.B. an, ob es sich um eine Überschrift, eine Liste oder einen gewöhnlichen Absatz handelt. Mit Hypertext kann ein Text von einem Marker, wie dem Blockelement „<div>“ oder dem Inline-Element „<strong>„, umschlossen werden und dergestalt können Inhalte zusammengefasst und sowohl semantisch wie optisch hervorgehoben werden.

(mehr …)

8-Bit over 7-Bit – Sonderzeichenmurks aus dem Mailfächle

tempa wrote this 04:51:

Viel Infos kommen im Postfach des Mailprogramms an und manchmal möchte man die Mails aus der Inbox oder einem der Unterordner in PHP weiter verwursten. Und 50 Jahre nach Gründung des Internets und des sehr regen internationalen Internetdatenverkehr scheint sich eine Vereinheitlichung der Datenformate noch immer etwas zu zieren. UTF-8 ist auf meinem alten Rechner nicht standard. Ich muss immer noch darauf achten, dass ich von ANSI auf utf-8 umstellen muss. Wenn ich bei der Verarbeitung auf Datensalad bei Sonderzeichen stoße, ist mein erster Gedanke UTF-8 zu ANSI Murks. Ich gehe also zu utf8_encode bzw. utf8_decode um den Zeichensalat aufzulösen. Pech gehabt!

Wenn Mail utf-8 ist, HTML charset utf-8 ist und das Script utf-8 ohne BOM gespeichert ist, könnte man verzweifeln. Den mit ut8_encode oder utf8_decode kommt man hier nicht weiter. Der Charset ist nicht das Problem, sondern der Faktor der ein Zeichen vom anderen trennt. Ein wahres Wunder also, dass nur die Sondezeichen betroffen sind. Der Umstieg von 7 Bit auf 8 Bit (Quoted Printable aus dem Mailkanal) findet man in der PHP-Doku unter den String-Funktionen (ohne Querverweis bei den Mailfunktionen): quoted_printable_decode

  1. $string = "=C3=84 =C3=96 =C3=9C, =C3=84=C3=96=C3=9C";
  2. echo quoted_printable_decode($string);
  3. /* Sonderzeichenausgabe: Ä Ö Ü, ÄÖÜ */

Dem DAU wird die Problemzuordnung in der Doku erschwert. Ist dort schließlich statt des Gleichheitszeichen „=“ das Prozentzeichen „%“ verwendet. Wäre ich kleiner PHP-Dau nicht über die RegEx-Syntax gestolpert und hätte im Forum php.de gefragt, hätte ich immer noch nicht das Problem korrekt identifiziert. Meine Lösung war ein preg_replace mittels Zeichen-Set im JSON-Objekt:

  1. $mails = file_get_contents("[Pfad zur Inbox]/1.eml");
  2. $chars = json_decode('{"Ä" : "=C3=84", "Ö" : "=C3=96","Ü" : "=C3=9C","ß" : "=C3=9F","ä" : "=C3=A4","ö" : "=C3=B6","ü" : "=C3=BC","EUR" : "=E2=82=AC"}');
  3. foreach ($chars as $key => $value){
  4. $mails = preg_replace(/$value/ , $key, $mails);
  5. }

Für dieses Problem zu umständlich (auch potentiell unvollständig), aber generell ein nettes, übersichtliches Script um mehrere Begriffe in einem Text auszutauschen und als solches nicht ganz für die Katz.

Syntax Highlighting

tempa wrote this 01:25:

Ich will bunte Codeschnipsel-Bereiche. Wie geht das? Die kurze Antwort ist ein Verweis auf das populäre GeSHi, den Generic Syntax Highlighter.

Die PHP-Funktion, die diese Aufgabe mittels inline styles löst, lautet: highlight_string().

  1. <?PHP
  2. $extCodeFile = "codeFolder/codeschnipsel.phps";
  3. $codeSample = <<<CODESCHNIPSEL
  4. Hier mehzeiligen Code-Schnipsel einfügen.
  5. CODESCHNIPSEL;
  6. ?>
  7. <h3>Code von externem File?</h3>
  8. <div class="codetxt">
  9. <?PHP highlight_string($extCodeFile); ?>
  10. </div>
  11. <h3>Code von HEREDOC Variable?</h3>
  12. <div class="codetxt">
  13. <?PHP highlight_string($codeSample); ?>
  14. </div>

Wer auf ein einheitliches, ungebrochenes Farbschema in seiner Site achtet und ansonsten es liebt die Kontrolle über seinen Code und sein CSS zu behalten, der wird die PHP-Funktion überarbeiten müssen. Einen sehr guten Beitrag hierzu findet man im Blog auf regexp-evaluator.de: PHP-Highlighting-Funktion verbessern.

Zufallsgenerierte Bildergalerie

tempa wrote this 19:27:

Gesteuert wird die Galerie von zwei ini-Files, um die Daten und Einstellungen aufzunehmen und an PHP zu übergeben. Die Datenstruktur eines Ini-Textfiles ist einfach und übersichtlich und wird mit parse_ini_file() (siehe Zeile 4) direkt in einem Array aufgenommen.

In eckigen Klammern ist der Array-Key, gefolgt vom Parameter-Key ‚param1‘, ‚param2‘ in einem nested Array. Die Bezeichnungen sind frei wählbar. und erlauben so die sprechende und übersichtliche Darstellung der Array-Inhalte, siehe Galerie-Setting und Galeriedaten.

  1. [Key]
  2. param1= ""
  3. param2= ""

Der Zufallsgenerator kommt von array_rand() (siehe Zeile 7). Schließlich noch mittels der Bausteine und dem array_rand den HTML code generieren (Zeile 10).

  1. $cPath = "";
  2. $tcPhrases = $cPath.'tc_randomizer_setting.ini';
  3. $tcThumbs = $cPath.'tc_randomizer.ini';
  4. $phrasesArr = (file_exists($tcPhrases)) ?
    parse_ini_file($tcPhrases, TRUE) : die("Phraselist does not exist.");
  5. $thumbsArr = (file_exists($tcThumbs)) ?
    parse_ini_file($tcThumbs, TRUE) : die("Thumbslist does not exist.");
  6. $tci =($phrasesArr['repeatLine']['anz']=="")?
    '2' : $phrasesArr['repeatLine']['anz'];
  7. $randThumbs = array_rand($thumbsArr,6);
  8. for($tcj=0; $tcj< $tci; $tcj++){
  9. $picArr = explode(',',$thumbsArr[$randThumbs[$tcj]]['listPic']);
  10. echo "{$phrasesArr['htmlBausteine']['htmlB1']}<a
    href=\"{$tcjumper}index.php?p={$randThumbs[$tcj]}\" {$phrasesArr['linkParam']['aP3']}
    {$phrasesArr['linkParam']['aP4']}>{$phrasesArr['htmlBausteine']['htmlB2']}<img
    src=\"{$tcjumper}img/{$picArr[array_rand($picArr)]}\"
    alt=\"{$phrasesArr['theLine']['phrase1']}{$thumbsArr[$randThumbs[$tcj]]['range1']}
    {$thumbsArr[$randThumbs[$tcj]]['altText']}\" {$phrasesArr['htmlBausteine']['imgP1']}
    {$phrasesArr['htmlBausteine']['imgP2']}{$phrasesArr['htmlBausteine']['imgP3']} {$slash}>
    {$phrasesArr['htmlBausteine']['htmlB3']}</a>{$phrasesArr['htmlBausteine']['htmlB4']}<a
    href=\"{$tcjumper}index.php?p={$randThumbs[$tcj]}\" {$phrasesArr['linkParam']['aP3']}
    {$phrasesArr['linkParam']['aP4']}>{$phrasesArr['theLine']['phrase2']}
    {$thumbsArr[$randThumbs[$tcj]]['range2']}{$thumbsArr[$randThumbs[$tcj]]['linkText']}</a>
    {$phrasesArr['htmlBausteine']['htmlB5']}\r\n";
  11. }

Das Resultat des Codes sieht unter der Haube (im Source) wie Folgend aus:

  1. <dl class="randgal">
  2. <dt><a href="index.php?p=t01"><img
    src="img/t01e_thumb.jpg" alt="Template 01 A-G" /></a></dt>
  3. <dd><a href="index.php?p=t01">Template 01 A-G</a></dd>
  4. <dt><a href="index.php?p=t02"><img
    src="img/t02a_thumb.jpg" alt="Template 02 A" /></a></dt>
  5. <dd><a href="index.php?p=t02">Template 02 A</a></dd>
  6. <dt><a href="index.php?p=t10"><img
    src="img/t10a_thumb.jpg" alt="Template 10 A" /></a></dt>
  7. <dd><a href="index.php?p=t10">Template 10 A</a></dd>
  8. <dt><a href="index.php?p=t14"><img
    src="img/t14b_thumb.jpg" alt="Template 14 A-F" /></a></dt>
  9. <dd><a href="index.php?p=t14">Template 14 A-F</a></dd>
  10. <dt><a href="index.php?p=t20"><img
    src="img/t20f_thumb.jpg" alt="Template 20 A-F" /></a></dt>
  11. <dd><a href="index.php?p=t20">Template 20 A-F</a></dd>
  12. <dt><a href="index.php?p=t21"><img
    src="img/21d_thumb.jpg" alt="Template 21 A-H" /></a></dt>
  13. <dd><a href="index.php?p=t21">Template 21 A-H</a></dd>
  14. </dl>

Die Demo gibt es hier (Demo-Source).

Zebrastreifen im CSS

tempa wrote this 01:02:

Irgendwie ist es doof, dass CSS selbst Modulo nicht zu kennen scheint … zumindest habe ich nichts gefunden. Es gibt zahlreiche Javascriptlösungen. Hier jene auf A List apart: Zebra Tables

Und das ist meine Lösung per PHP:

  1. <tr<?php $num = ($num+1); echo ($num % 2) ? '' : ' class="odd"';?>>
  2. <td>SP1R1 Zelleninhalt</td>
  3. <td>SP2R1 Zelleninhalt</td>
  4. <td>SP3R1 Zelleninhalt</td>
  5. </tr>
  6. <tr<?php $num = ($num+1); echo ($num % 2) ? '' : ' class="odd"';?>>
  7. <td>SP1R2 Zelleninhalt</td>
  8. <td>SP2R2 Zelleninhalt</td>
  9. <td>SP3R2 Zelleninhalt</td>
  10. </tr>

Das geht vermutlich eleganter, aber immerhin, es ist immer die selbe Zeile so dass man sich keine Gedanken machen muss, ob dies nun eine gerade oder ungerade Zeile ist und man kann jederzeit zwischenrein eine Zeile einfügen. Die Streifen bleiben erhalten.

Ursprünglich gepostet am 23. Oktober 06, 03:34 in meinem Blog „Silkester erzählt“.

Update:

CSS3 bietet für diese beliebte Listendarstellung mittlerweile nth-child siehe W3C Pseudoklassen (6.6.5.2. : nth-child() pseudo-class)

  1. foo:nth-child(even) { backrgound-color: "#999" }
  2. foo:nth-child(odd) { backrgound-color: "#CCC" }

nth-child wird in fast allen aktuellen Browsern unterstützt. Unbeachtet bleibt die Pseudo-Klasse im IE, selbst im IE8. Für IE gibt es den folgenden Heckmeck:

  1. /* li:nth-child(2) */
  2. li:first-child + li {}/*Works for IE8*/

Recent Comments:

  • Silke schümann { Du warst auf dieser Seite: Step1 zur Archiv-Thumbgalerie via Custom fields Marke Eigenbau http://templaterie.de/blog/931/step1-zur-archiv-thumbgalerie-via-custom-fields-marke-eigenbau/ Hier war ich noch am Basteln. Ich fürchte meine PHP-Kenntnisse sind... } – Aug 26, 9:29 AM
  • Andreas { Hey, ich habe den Code wie oben benutzt und auch $dgal = get_posts('category=1′); on der richtigen Zeile eingesetzt nur bei mir läufts immernoch nicht. Kann... } – Aug 26, 3:20 AM
  • Fred { "wer Smarty lernt, kann tatsächlich gleich auch PHP mitmachen, ich hatte es eine zeitlang auch eingesetzt, aber jetzt mach ich es wieder auf meine art... } – Jan 06, 7:14 PM
  • Silke Schümann { Das klingt nach einem Syntaxfehler in der ersten Zeile. Anführungszeichen korrekt? Und das Plugin funktioniert nur innerhalb von Editland. Die index.php ausserhalb von Editland aufzurufen... } – Jun 18, 3:40 PM
  • Jörg { Hallo, ich habe die index.php im ersten Abschitt Nr. 3 beschrieben, angelegt. Beim Aufruf der Seite wird folgende Fehlermeldung angezeigt: Parse error: parse error, unexpected... } – Jun 18, 3:14 PM
  • Michael { Gern geschehen 😉 } – Mai 29, 2:31 PM
  • Silke Schümann { Jepp. Das war's: ES tut! Lösung ist nun in einem eigenen Beitrag: Step1 zur Archiv-Thumbgalerie via Custom fields Marke Eigenbau Fertig und betriebstüchtig! 🙂 } – Mai 29, 1:25 PM
  • Michael { Wie wäre es, wenn Du die Zeile $dgal = get_posts('category=1'); auslagerst und den Rest in eine Funktion packts, der Du $dgal übergibst. Das wäre auch... } – Mai 29, 12:45 PM
  • Silke Schümann { Ich ziehe diees Variante ebenfalls vor, dovh wenn ich Code übernehmen, dann ändere ich hierfür nicht extra. Es dürfte gehzpft wei gesprungen sein, welche man... } – Mai 29, 2:00 AM
  • Ulf { ich würde bei der Syntax für Schleifen konsequent die C-ähnliche Variante mit geschweiften klammern nehmen, nicht die alternative mit Doppelpunkt und "endwhile" bzw. "endforeach". } – Mai 29, 12:00 AM
  • Silke Schümann { Ich habe ich http://franchie.de die Thumbs in der Sidebar erfolgreich ausgelesen. Ansonsten ist die Test-Umgebung unter 1a-test dot de / blog Ich will diese Adresse... } – Mai 28, 11:37 PM