Andreas Kampitsch: Maskierungsproblem

Ich habe ein PHPSkript in Verbindung mit JavaScript und die stellt mich vor folgendes Problem:

document.write("
<?php echo "

<div id='menunews' style='position:absolute; width:110px; height:32px; z-index:96; background-color: #999999; layer-background-color: #999999; border: 1px none #000000; left: 150px; top: 139px; visibility: hidden' onMouseOver='ende(0);' onMouseOut='verzoegerung(0);' >
  <table width='100%' border='1' bordercolor='black' style='border-color:#000000; border-width:1px; border-style:solid; background-color:#999999;'>
    <tr>
      <td style='cursor:hand;' id='date1' class='submenu' onMouseOver='farbe_aendern("date1","submenu_over","adate1","#FFFFFF");' onMouseOut='farbe_aendern("date1","submenu","adate1","#990000");'><span id='adate1'>Juni
        2003 </span></td>
    </tr>
    <tr>
      <td style="cursor:hand;" id="date2" class="submenu" onMouseOver="farbe_aendern('date2','submenu_over','adate2','#FFFFFF');" onMouseOut="farbe_aendern('date2','submenu','adate2','#990000');"><span  id="adate2">Mai
        2003 </span></td>
    </tr>
    <tr>
      <td style="cursor:hand;" id="date3" class="submenu" onMouseOver="farbe_aendern('date3','submenu_over','adate3','#FFFFFF');" onMouseOut="farbe_aendern('date3','submenu','adate3','#990000');"><span id="adate3">April
        2003</span> </td>
    </tr>
  </table>
</div>"; ?>
");

Wenn dieser Codew ausgeührt werden soll, kommt immer die Fehlermeldung, dass eine Zeichenfolge nicht abgeschlossen wäre.

Das, so nehme ich an, stellt mich vor ein Maskierungsproblem, dass ich nicht lösen kann.
Kann mir vielleicht jemand zeigen und helfen, wie es richtig zu markieren wäre?

Vielen Dank im Voraus!

A. Kampitsch

  1. Hallo Andreas,

    <table width='100%' border='1' bordercolor='black' style='border-color:#000000; border-width:1px; border-style:solid; background-color:#999999;'>

    Warum definierst du das ganze nicht nur mit CSS?

    <td style='cursor:hand;' id='date1' class='submenu' onMouseOver='farbe_aendern("date1","submenu_over","adate1","#FFFFFF");' onMouseOut='farbe_aendern("date1","submenu","adate1","#990000");'><span id='adate1'>Juni

    Hier hast du schön maskiert,

    <td style="cursor:hand;" id="date2" class="submenu" onMouseOver="farbe_aendern('date2','submenu_over','adate2','#FFFFFF');" onMouseOut="farbe_aendern('date2','submenu','adate2','#990000');"><span  id="adate2">Mai

    aber hier nicht mehr...

    Kann mir vielleicht jemand zeigen und helfen, wie es richtig zu markieren wäre?

    Verwende einen guten PHP-Editor mit Syntax-Highlighting, der zeigt dir soclhe
    Fehler gleich an.

    Grüße
      David

    --
    >>Nobody will ever need more than 640k RAM!<<
    1981 Bill Gates
  2. Hi,

    Das, so nehme ich an, stellt mich vor ein Maskierungsproblem, dass ich nicht lösen kann.
    Kann mir vielleicht jemand zeigen und helfen, wie es richtig zu markieren wäre?

    bei backslash maskiert z.B. ein Anführungszeichen

    echo "balbla ich stehe in "Anführungszeichen" ";

    ciao
    romy

  3. hallo
    so wie ich gesehen habe hast du in deiner ausgabe " und " genutzt.
    du hast mit echo zwei möglichkeiten.
    1)
    echo'<td width="10">'; hier stören die " nicht
    ACHTUNG Variablen werden als string ausgegeben

    echo"<td width="10">"; hierbei müßen die " maskierd werden "

  4. Hallo Andreas,

    Wieso es nicht funktioniert? Du hast unsauber gearbeitet... Außerdem ist Deine Lösung viel zu umständlich.

    <td style="cursor:hand;"

    ^ ab hier muß " natürlich auch durch ' oder " ausgetauscht werden...

    Es geht auch einfacher und weniger fehleranfällig, z.B. so:

    <?php

    $code = <<<END_OF_CODE
    <div id="menunews" style="position:absolute; width:110px; height:32px; z-index:96; background-color: #999999; layer-background-color: #999999; border: 1px none #000000; left: 150px; top: 139px; visibility: hidden" onMouseOver="ende(0);" onMouseOut="verzoegerung(0);">
      <table width="100%" border="1" bordercolor="black" style="border-color:#000000; border-width:1px; border-style:solid; background-color:#999999;">
        <tr>
          <td style="cursor:hand;" id="date1" class="submenu" onMouseOver="farbe_aendern('date1', 'submenu_over', 'adate1', '#FFFFFF');" onMouseOut="farbe_aendern('date1', 'submenu', 'adate1', '#990000');">
            <span id="adate1">Juni 2003</span>
          </td>
        </tr>
      <!-- usw. -->
      </table>
    </div>
    END_OF_CODE;

    print "document.write('$code')";

    ?>

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

    P.S.: Die Zeilenumbrüche könnten ein Problem für den Javascript-Interpreter sein und müssen ggf. entfernt werden...

    MfG
    Danny

    1. Vielen Dank an alle, die mir geantwortet haben.

      Die heredoc-Syntax funktioniert irgendwie teilweise,...

      die Ausgabe funktioniert zwar, trotzdem habe ich einen Laufzeitfehler,.. ich werde noch den zweiten Vorschlag mit addslashes etc. versuchen und dann nehmen, was besser funktioniert. ;-)

      Und, ich muss PHP einbinden, da nicht immer Juli 2003 ist und ich dieses Feld verändern will;-)

      Andreas

      1. Hi,

        Und, ich muss PHP einbinden, da nicht immer Juli 2003 ist und ich dieses Feld verändern will;-)

        dann binde es nur an der Stelle ein und nicht im ganzen Dokument.

        Beispielsweise:
        document.write("<div align="center"> blabla <?=$date?> blabla <div>");

        ciao
        romy

  5. Moin!

    Ich habe ein PHPSkript in Verbindung mit JavaScript und die stellt mich vor folgendes Problem:

    document.write("
    <?php echo "
    "; ?>
    ");

    Wenn dieser Codew ausgeührt werden soll, kommt immer die Fehlermeldung, dass eine Zeichenfolge nicht abgeschlossen wäre.

    Logisch. Du hast hier vermutlich das komplexeste Maskierungsproblem, dass man sich bei der Verbindung von PHP und Javascript vorstellen kann, weil alle Anführungszeichen zu mehreren Zeiten nicht nur Zeichen sind, sondern eine besondere Bedeutung haben.

    Bedenke immer: Entscheidend ist, was im Browser ankommt. Und da soll sowas ankommen:

    document.write("String mit " und ' Anführungszeichen!");

    Klar: Das " muß escapet werden. Das ' _darf_ escapet werden.

    Wenn du jetzt den Stringinhalt mit PHP reinschreiben willst, mußt du logischerweise dafür sorgen, dass die Ausgabe von PHP Maskierungszeichen ausgibt, die in Javascript wirksam werden.

    echo "Ein " und ein ' Anführungszeichen";

    Schreibt den Text
    Ein " und ein ' Anführungszeichen.

    Und wenn du dir dann das document.write() drumherumdenkst, wird klar, dass das nicht funktionieren kann:

    document.write("<?php echo "Ein " und ein ' Anführungszeichen"; ?>");
    führt zu
    document.write("Ein " und ein ' Anführungszeichen.");
    und das funktioniert nicht.

    Du mußt also alle Anführungszeichen, die in Javascript ankommen, maskieren. Da sie in PHP auch schon maskiert sind, mußt du sie praktisch doppelt maskieren: Du mußt das Maskierungszeichen zusätzlich in Javascript ausgeben.

    Das führt zu:
    document.write("<?php echo "Ein \" und ein \' Anführungszeichen"; ?>");

    Im Browser kommt dann
    document.write("Ein " und ein ' Anführungszeichen.");
    an.

    Du wirst fragen: Geht das nicht einfacher? Klar geht das einfacher. Verwende addslashes().

    document.write("<?php echo addslashes("Ein " und ein ' Anführungszeichen"); ?>");

    Alle anderen Lösungsvorschläge, die ich in diesem Thread bislang gesehen habe, gehen leider alle am Kernproblem vorbei. Insbesondere bei der Here-Doc-Variante bin ich mir nicht sicher, ob Backslashes nicht doch gefressen werden - und damit gar nicht in Javascript ankommen, was aber dringend notwendig wäre.

    - Sven Rautenberg

    --
    SELFTREFFEN 2003 - http://selftreffen.kuemmi.ch/
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
  6. Hallo Andreas,

    document.write("
    <?php echo "
    [...]
    </div>"; ?>
    ");

    mal eine ganz blöde Frage meinerseites: warum machst du überhaupt einen php-Bereich auf? Lass das "<?php echo" bzw. das "?>" doch einfach weg - dann hast du das Maskierungsproblem nicht (bzw. es ist nicht mehr ganz so kompliziert).

    Grüße aus Nürnberg
    Tobias [der hofft, dass er jetzt keine Unsinn erzählt hat :-)]

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|