MO: Stringaddition

Hallo zusammen.
Ich habe nun schon einiges gelesen, aber es ist mir immer noch nicht ganz klar, wie die Stringaddition korrekt gemacht wird, wenn Anführungszeichen im String enthalten sind:

Beispiel 1:
$TempContent = "<img src="".$imgPath."" Width="".$imgWidth."" Height="".$imgHeight."" Title="".$imgTitle."" Alt="".$imgAlt."">";

Beispiel 2:
$TempContent = "<img src='".$imgPath."' Width='".$imgWidth."' Height='".$imgHeight."' Title='".$imgTitle."' Alt='".$imgAlt."'>";

Beispiel 3:
$TempContent = "<img src="$imgPath" Width="$imgWidth" Height="$imgHeight" Title="$imgTitle" Alt="$imgAlt">";

Die einfachste Lösung ist Beispiel 3. Aber welches ist die wirklich korrekte? Funktionieren tun alle drei....
Was meint ihr?

  1. Hallo MO,
    ich finde solche Fragen gut, weil die Literatur
    solche Fragen als "Vorgegeben" abtut und nicht weiter
    darauf eingeht. Als ich noch Anfänger war hatte ich tonnenweise
    solcher Fragen, die mir keiner beantworten konnte. ;-)

    Beispiel 1:
    $TempContent = "<img src="".$imgPath."" Width="".$imgWidth."" Height="".$imgHeight."" Title="".$imgTitle."" Alt="".$imgAlt."">";

    Ist sinnvoll wenn eine Variable falsch verstanden werden könnte,
    somit schadet es natürlich nicht sich diese Schreibweise
    anzugewöhnen wenn man eine solche Fehlerquelle durch
    seinen Schreibstil im Vorfeld eleminiert.
    Bsp.
    $test = 1234;
    $xy = "xxxHallo Welt $testxxx";
    // Hier würde durch diesen Flüchtigkeitsfehler
    // die Variable $testxxx gesucht und nicht $test.

    ------------------------------

    Beispiel 2:
    $TempContent = "<img src='".$imgPath."' Width='".$imgWidth."' Height='".$imgHeight."' Title='".$imgTitle."' Alt='".$imgAlt."'>";

    Einfache Anführungszeichen werden manchmal ignoriert,
    habe schlechte Erfahrrung damit.

    -----------------------

    Beispiel 3:
    $TempContent = "<img src="$imgPath" Width="$imgWidth" Height="$imgHeight" Title="$imgTitle" Alt="$imgAlt">";

    Standard so würde auch der PHP Parser das mit der
    Funktion addslashes(); machen.

    Fazit:
    Wähle zwischen 1 oder 3, aber bleibe einem Stil treu.

    Gruss Nikki

    1. Hallo,

      $TempContent = "<img src='".$imgPath."' Width='".$imgWidth."' Height='".$imgHeight."' Title='".$imgTitle."' Alt='".$imgAlt."'>";

      Einfache Anführungszeichen werden manchmal ignoriert,
      habe schlechte Erfahrrung damit.

      Einfache Anfuehrungszeichen waren schon in HTML 2.0 ausdruecklich
      erlaubt, um Attributswerte "einzupacken":

      RFC 1866 - Hypertext Markup Language - 2.0 (November 1995):
      http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt
         "The value of the attribute may be either:
             * A string literal, delimited by single quotes or double
             quotes and not containing any occurrences of the delimiting
             character.
               [...]"

      Etwa das gleiche steht in der HTML 4.01 Specification:
      http://www.w3.org/TR/html401/intro/sgmltut.html#h-3.2.2

      Ich halte es deshalb bis zum Beweis des Gegenteils fuer ein
      Geruecht und fuer hartnaeckigen Aberglauben, dass einfache
      Anfuehrungszeichen Probleme bereiten sollen.

      Und ich denke, dass ein Browser, der nicht mal HTML 2.0 kann,
      auf dem heutigen Internet und Web nicht mehr einsatzfaehig ist.

      @Nicole: Kannst Du es bitte etwas genauer erlaeutern?
      Mit einem konkreten (validen) Beispiel bzw. mit einem konkreten Browser,
      der das offensichtlich nicht kann? Ich waere Dir sehr dankbar.

      ---

      Ich wuerde es wie folgt schreiben:

      $TempContent = "<img src='$imgPath' width='$imgWidth' height='$imgHeight' title='$imgTitle' alt='$imgAlt'>";

      Das ist IMHO am uebersichtlichsten (abgesehen von der Heredoc-Schreibweise).
      Es darf nur kein (hier: einfaches) Anfuehrungszeichen in einem der Werte (z.B. Title, Alt)
      vorkommen, aber darauf muss man sowieso achten, egal, mit welcher PHP-Schreibweise
      man den String zusammenbaut und egal, welche Anfuehrungezeichen man verwendet.
      Zwischen einfachen Anfuehrungszeichen darf kein uncodiertes einfaches Anf.z. vorkommen,
      zwischen doppelten kein uncodiertes doppeltes Anf.z. - eigentlich logisch, und es steht
      auch ausdruecklich in den HTML Specifications.
      Andere Nachteile sehe ich nicht.

      Folgendes ist valides HTML 4 und funktioniert in allen mir bekannten Browsern problemlos,
      inklusive korrekter Tooltip-Anzeige:
      <img src="elvis.jpg" alt="Elvis "The King" Presley" title="Elvis "The King" Presley">
      <img src='rocknroll.gif' alt='Rock&#39;n&#39;Roll' title='Rock&#39;n&#39;Roll'>

      "Es ist Geschmackssache", bzw.  wie Lulu schrieb: "Es kommt darauf an"
       ;-)

      Gruesse,

      Thomas

      P.S. @lulu: MO schreibt offenbar nicht XHTML - also darf er/sie die Attributs-Namen
      gross oder klein schreiben, nach Lust und Laune.
      Natuerlich ist es im Hinblick auf einen spaeteren Wechsel zu XHTML empfehlenswert,
      sich auch schon in HTML an die Regeln zu halten, die mit HTML vereinbar sind,
      z.B. konsequente Kleinschreibung von Element- und Attributs-Namen, aber
      vorgeschrieben ist das nirgends.
      Ich weiss, du hast "sollten" geschrieben, nicht "muessen"...

      1. Hallo Thomas,
        wie ich schon sagt ich hasse einfache Anführungszeichen
        weil ich konsequent die letzten Jahre immer Probleme
        damit hatte. Zuletzt vor 2 Tagen:

        Ich nutze einigen Sprachen die ich include.
        Da alle in einem Array sind, sind " durch Backslashes
        geschützt. Ebenso aber auch '. Alles durch die Funktion
        addslashes. Bei der Ausgabe im Browser sieht das dann so
        aus, dass " ganz normal und '  dann so  ' angezeigt werden.
        Allein aus diesem Grund musste ich das gesamtte Array dann
        nochmal durchlaufen lassen:
        // foreach($lang_ar as $ohneslash){$lang_ar[$i]=stripslashes($ohneslash);$i++;}

        Dies ist nur eines von vielen Beispielen.
        Ein anderes steht hier in den Antworten bereits drin:

        Also z.B. bei alt="rock'n'roll".

        Gruss Nikki

        @Nicole: Kannst Du es bitte etwas genauer erlaeutern?
        Mit einem konkreten (validen) Beispiel bzw. mit einem konkreten Browser,
        der das offensichtlich nicht kann? Ich waere Dir sehr dankbar.

        1. Hallo Nikki,

          Zum Code-Beispiel von MO
          $TempContent = "<img src='".$imgPath."' Width='".$imgWidth."' Height='".$imgHeight."' Title='".$imgTitle."' Alt='".$imgAlt."'>";
          welches z.B. folgendes HTML ausspuckt:
          <img src='pfad/zum/bild.gif' Width='100' Height='50' Title='Titel/Tooltip Text' Alt='Alternativ Text'>
          hattest Du geschrieben:

          Einfache Anführungszeichen werden manchmal ignoriert,
          habe schlechte Erfahrrung damit.

          Das verstand ich so, dass Du der Meinung bist, dass _Browser_
          mit _HTML-Quellcode_, bei dem die Attributswerte durch
          einfache Anfuehrungszeichen begrenzt sind, nicht klarkommen.
          Und _das_ kann ich einfach nicht glauben.

          Jetzt schreibst Du aber:

          [...] Bei der Ausgabe im Browser sieht das dann so
          aus, dass " ganz normal und '  dann so  ' angezeigt werden.

          Das ist aber _Dein_ Problem, das mit PHP und mit (allenfalls automatischem)
          Hinzufuegen und Entfernen von Backslashes bei irgendwelchen Transaktionen
          (Formulare, MySQL, ...) zu tun hat.

          Die Backslashes stehen dann offensichtlich auch im HTML-Quelltext,
          weil _Du_ sie nicht entfernt hast.

          Die Unterschiede zwischen " und ' betreffen PHP (z.B. addslashes/stripslashes)
          und allenfalls MySQL.

          Das alles hat aber IMHO ueberhaupt nichts mit HTML zu tun.
          Und auch nicht mit Browsern.

          Mein Fazit:
          Die Schreibweise
          $TempContent = "<img src='".$imgPath."' Width='".$imgWidth."' Height='".$imgHeight."' Title='".$imgTitle."' Alt='".$imgAlt."'>";
          und das entsprechende, uebersichtlichere
          $TempContent = "<img src='$imgPath' width='$imgWidth' height='$imgHeight' title='$imgTitle' alt='$imgAlt'>";
          ist voellig unproblematisch - solange die Variablen $imgPath, $imgTitle und $imgAlt
          kein uncodiertes einfaches Anfuehrungszeichen ' enthalten.
          (Bei $imgWidth und $imgHeight gehe ich mal davon aus, dass sie nur Zahlen enthalten.)

          Aber das schrieb ich ja bereits, und es hat wiederum nichts
          mit PHP zu tun, sondern ist logisch, wenn man die HTML
          Specification liest und wenn man den resultierenden
          HTML-Quellcode anschaut.

          Freundliche Gruesse
          Thomas

          1. Hallo Thomas,

            Das ist aber _Dein_ Problem, das mit PHP und mit (allenfalls automatischem)
            Hinzufuegen und Entfernen von Backslashes bei irgendwelchen Transaktionen
            (Formulare, MySQL, ...) zu tun hat.

            Nein, das ist Dein Problem !
            Die Rubrik dieser Frage heisst PHP und nicht HTML.

            Die Frage war "was ist sinnvoller".

            Die Backslashes stehen dann offensichtlich auch im HTML-Quelltext,
            weil _Du_ sie nicht entfernt hast.

            Ja stehen Sie aber auch bei ", und diese werden eben nicht
            im "BROWSER" angezeigt. Was widerum gegen die Benutzung
            von ' spricht, solange man nicht muss.

            Das alles hat aber IMHO ueberhaupt nichts mit HTML zu tun.
            Und auch nicht mit Browsern.

            Eben es geht um PHP ;-)

            Gruss Nikki

      2. Ich wuerde es wie folgt schreiben:

        $TempContent = "<img src='$imgPath' width='$imgWidth' height='$imgHeight' title='$imgTitle' alt='$imgAlt'>";

        Hallo ihr drei.
        Hab zwar eben schon geantwortet..aber meine Antwort ist wohl nicht angekommen...komisch...mein Mozilla?
        Ok..hier nochmal..
        Vielen Dank für die schnellen Antworten...sie helfen mir doch sehr

        @Thomas
        Ich bin ein Er....
        Aber zu deiner Antwort:
        Ich dacht, das Variablen die in Strings mit einfachen Anführungszeichen stehen vom Parser nicht interpretiert werden? Oder habe ich da was falsch verstanden....
        Zitat aus http://de.php.net/manual/de/language.types.string.php
        "Anmerkung:  Anders als bei den zwei anderen Schreibweisen werden Variablen und escape-Sequenzen für spezielle Zeichen innerhalb von single-quoted Strings nicht ausgewertet."
        Bitte um Erklärung....

        @lulu
        Vielen Dank für die Links...habe ich mir gleich mal in mein Scribbles gespeichert...

        @Nicole
        Ja, du hast recht. Ich weiß auch nicht, warum sie hier in diesem Beispiel ausgerechnet Groß geschrieben habe...als aler Verfechter der durchgängigen Kleinschreibung....hihi...tststs
        Habe ich jetzt garnicht drauf geachtet

        Wünsch noch einen wundervollen Tag

        MO (Martin Oliver)

        1. Ich wuerde es wie folgt schreiben:

          $TempContent = "<img src='$imgPath' width='$imgWidth' height='$imgHeight' title='$imgTitle' alt='$imgAlt'>";

          Ups...sollte genauer lesen..schäm
          ist ja in doppelten Anführungszeichen....ja ok...Schande über mich...

          Liebe Grüße
          MO

  2. Moin MO

    Ich habe nun schon einiges gelesen, aber es ist mir immer noch nicht ganz klar, wie die Stringaddition korrekt gemacht wird, wenn Anführungszeichen im String enthalten sind:

    Beispiel 1:
    $TempContent = "<img src="".$imgPath."" Width="".$imgWidth."" Height="".$imgHeight."" Title="".$imgTitle."" Alt="".$imgAlt."">";

    Beispiel 2:
    $TempContent = "<img src='".$imgPath."' Width='".$imgWidth."' Height='".$imgHeight."' Title='".$imgTitle."' Alt='".$imgAlt."'>";

    Beispiel 3:
    $TempContent = "<img src="$imgPath" Width="$imgWidth" Height="$imgHeight" Title="$imgTitle" Alt="$imgAlt">";

    Die einfachste Lösung ist Beispiel 3. Aber welches ist die wirklich korrekte? Funktionieren tun alle drei....
    Was meint ihr?

    Die Attribut-Namen sollten klein geschrieben werden.
    Beispiel 2 könnte problematisch werden sobald ein ' als Attribut-Wert
    benutzt werden muss.

    Also z.B. bei alt="rock'n'roll".

    Ansonsten lies das

    http://de.php.net/manual/en/language.types.string.php

    Mein Favorit wäre

    http://de.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

    oder

    http://de.php.net/manual/en/function.sprintf.php

    Und unter Stringaddition versteht man eigentlich etwas anderes.
    http://de.php.net/manual/en/language.operators.string.php

    Ansonsten kann man Deine Frage wohl am besten mit "Es kommt drauf an"
    beantworten, wobei es neben Deinen drei Beispielen noch einige weitere Lösungsmöglichkeiten gibt.

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday