Matze: Verständnissproblem bei date()

Hallo,

ich habe ein Verständnissproblem beim Escapen in der date-Funktion.

Also
echo date("\H\e\u\t\e \i\s\t\ D, \d\e\r d. M Y");
liefert mir z.B. "Heu e is Thu, de 03. Sep 2009".

Es werden also die "t" in "Heute" und "ist", sowie das "r" von "der" nicht angezeigt.

Richtig funktioniert es so:
echo date("\H\e\u\\t\e \i\s\\t\ D, \d\e\\r d. M Y");

Kann mir bitte einer sagen warum das so ist?
Warum muss ich die 3 Buchstaben doppelt maskieren?

Danke und Grüße, Matze

  1. Warum muss ich die 3 Buchstaben doppelt maskieren?

    weil \t z.B. in einem Double-Quoted-String bereits einen Tabulator darstellt

    PHP: Strings

    btw: warum nicht einfacher: echo 'Heute ist' . date('D') . ', der ' . date('d. M Y');

    Ich würde dir allerdings allgemein zu setlocale() und strftime() raten als zu Date.

    1. Hallo,

      weil \t z.B. in einem Double-Quoted-String bereits einen Tabulator darstellt

      logisch, daran hatte ich gar nicht gedacht.

      btw: warum nicht einfacher: echo 'Heute ist' . date('D') . ', der ' . date('d. M Y');

      Weil ich mir ersparen wollte die Funktion mehrfach aufzurufen.

      Ich würde dir allerdings allgemein zu setlocale() und strftime() raten als zu Date.

      Danke, ich schau mir an ob die Funktionen besser für meine Zwecke geeignet sind.

      Grüße, Matze

  2. Hi,

    echo date("\H\e\u\t\e \i\s\t\ D, \d\e\r d. M Y");

    unabhängig davon, ob dies in der date()-Funktion oder einem einfachen String passiert, führst Du hier kein Escaping durch, sondern verwendest nur Sonderzeichen. Beispielsweise "\H", welches aufgrund des Fehlens einer Sonderbedeutung als "H" interpretiert wird. "\t" ist ein Tabulator, "\n" wäre beispielsweise ein Umbruch.

    Willst Du hingegen die Zeichenkette
    \H\e\u\t\e \i\s\t\ D, \d\e\r d. M Y
    in der date()-Funktion verwenden, bringst Du sie in einen String-Kontext (hier also: Doublequotes). In diesem musst Du all jene Zeichen, die im String-Kontext eine Sonderbedeutung haben, kontextspezifisch mit Backslash maskieren - also insbesondere den Backslash.

    Warum muss ich die 3 Buchstaben doppelt maskieren?

    Die Frage müsste lauten, warum Du die anderen *nicht* maskieren musst. Allerdings ist die Antwort eher uninteressant, weil Du Deinen für date() bestimmten Wert in einen String-Kontext bringst, und *immer* dann, wenn Du einen Wert in einen Kontext bringst, *musst* Du ihn kontextspezifisch maskieren. Wenn hierbei Ausnahmen möglich sind, dann ist es (außer bei defekten Konzepten) niemals nötig, sie zu kennen - ignoriere sie einfach und maskiere korrekt.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi Cheatah.

      Beispielsweise "\H", welches aufgrund des Fehlens einer Sonderbedeutung als "H" interpretiert wird.

      Nein, "\H" wird aufgrund des Fehlens einer Sonderbedeutung als "\H" interpretiert. [PHP-Strings]

      Wenn es im String als "H" interpretiert wuerde, wuerde es von date() ja wiederum als die Anzahl der Stunden des Datums geparst.

      Viele Gruesse,
      der Bademeister