Bernhard Gräuler: XHTML, Links mit mehreren Variablen

Hallo an alle!

Ich bin gerade dabei, meine Seite so umzustricken, daß sie vom Validator vom W3C (http://validator.w3c.org) nicht mehr bemeckert wird. Ich will dass meine Seite XHTML 1.0 konform wird.

Komischerweise stellt sich der XHTML Validator bei Links mit mehreren Variablen quer.

Bei einem Link wie z.B.

<a href="onesite.php?var1=abc&var2=cde&var3=efg">
  Link zu einer Seite mit 3 Variablen
</a>

schmeißt (wirft) mir der Validator vor:

<a href="onesite.php?var1=abc&var2=cde&var3=efg">
                                         ^
Error: reference not terminated by refc delimiter

<a href="onesite.php?var1=abc&var2=cde&var3=efg">
                                                  ^
Error: reference not terminated by refc delimiter

Bedeutet das, ich kann ab jetzt nur noch eine Variable pro Link an ein Skript übergeben? Das ist doch Unsinn, oder? Hat hier jemand die XHTML Spezifikation im Kopf und kann mir erklären, warum das so ist?

Als einzige Lösung fällt mir im Moment nur ein, die Werte der Variablen durch eine Raute oder so getrennt an den Link zu hängen, also
<a href="onesite.php?var=abc#cde#efg">
   ...
Hab ich noch nicht getestet, sollte aber möglich sein. Ist aber völlig abwegig, da das niemand so macht, nur weil die Spezifikation so was möglicherweise vorschreibt. Außerdem ist das schlampig, weil die Variable erst wieder geparst werden muß, und sobald man etwas ändert und eine weitere Variable übergeben muß muß de Parser angepasst werden. Bei größeren Skripten, oder vielen Varablen pro Link ein Aufwand, der sich nur für XHTML Konformität meines Erachtens nicht lohnt.

Gibts für dieses Problem eine Lösung? Wenn ja, welche?

Vielen Dank schon mal
  Bernhard

  1. Hallo an alle!
    Ich bin gerade dabei, meine Seite so umzustricken, daß sie vom Validator vom W3C (http://validator.w3c.org) nicht mehr bemeckert wird. Ich will dass meine Seite XHTML 1.0 konform wird.
    Komischerweise stellt sich der XHTML Validator bei Links mit mehreren Variablen quer.
    Bei einem Link wie z.B.
    <a href="onesite.php?var1=abc&var2=cde&var3=efg">
      Link zu einer Seite mit 3 Variablen
    </a>
    schmeißt (wirft) mir der Validator vor:
           <a href="onesite.php?var1=abc&var2=cde&var3=efg">
                                             ^
    Error: reference not terminated by refc delimiter
           <a href="onesite.php?var1=abc&var2=cde&var3=efg">
                                                      ^
    Error: reference not terminated by refc delimiter
    Bedeutet das, ich kann ab jetzt nur noch eine Variable pro Link an ein Skript übergeben? Das ist doch Unsinn, oder? Hat hier jemand die XHTML Spezifikation im Kopf und kann mir erklären, warum das so ist?
    Als einzige Lösung fällt mir im Moment nur ein, die Werte der Variablen durch eine Raute oder so getrennt an den Link zu hängen, also
    <a href="onesite.php?var=abc#cde#efg">
       ...
    Hab ich noch nicht getestet, sollte aber möglich sein. Ist aber völlig abwegig, da das niemand so macht, nur weil die Spezifikation so was möglicherweise vorschreibt. Außerdem ist das schlampig, weil die Variable erst wieder geparst werden muß, und sobald man etwas ändert und eine weitere Variable übergeben muß muß de Parser angepasst werden. Bei größeren Skripten, oder vielen Varablen pro Link ein Aufwand, der sich nur für XHTML Konformität meines Erachtens nicht lohnt.
    Gibts für dieses Problem eine Lösung? Wenn ja, welche?

    Die Verwendung der oben genannten Variante mit den Raute-Zeichen (#). Ich hab die RFC2141 jetzt nicht im Kopf, dort ist aber das Aussehen der URI festgelegt. Die DTDs von XHTML sehen für das Element A eine Attribut href vom Typ URI vor, der in o.g. RFC festgelegt wird.

    Wenn Du das ganze an ein PHP-Script schickst dürfte es aber kein Parser-Problem geben: GET-String einfach anhand des #-Zeichen Trennen lassen und durch das ganze Array durchlaufen.

    Viele Grüße

    Thomas

    1. Die Verwendung der oben genannten Variante mit den Raute-Zeichen (#). Ich hab die RFC2141 jetzt nicht im Kopf, dort ist aber das Aussehen der URI festgelegt. Die DTDs von XHTML sehen für das Element A eine Attribut href vom Typ URI vor, der in o.g. RFC festgelegt wird.
      Wenn Du das ganze an ein PHP-Script schickst dürfte es aber kein Parser-Problem geben: GET-String einfach anhand des #-Zeichen Trennen lassen und durch das ganze Array durchlaufen.

      Kurze Ergänzung:

      Zitat von http://www.ietf.org/rfc/rfc2141.txt:
      "2.4 Excluded characters
      The following list is included only for the sake of completeness.
      Any octets/characters on this list are explicitly NOT part of the URN
      character set, and if used in an URN, MUST be %encoded:
      <excluded> ::= octets 1-32 (1-20 hex) | "" | """ | "&" | "<"
      | ">" | "[" | "]" | "^" | "`" | "{" | "|" | "}" | "~"                 | octets 127-255 (7F-FF hex)"

      D.h., das &-Zeichen ist explizit verboten. Ein Encoding als %26 bringt jedoch keine erwünschte Wirkung.
      Auf das #-Zeichen solltest Du besser verzichten - der Rest der Parameter wird nicht gelesen.
      Ein Link sollte also eher so aussehen:
      <a href="script.php?parameter=var1%3dinhalt1%26var2%3dinhalt2">txt</a>

      parameter enthält dann den String var1=inhalt1&var2=inhalt2, was wieder in einer allgemeinen Function geparst werden kann.
      Thomas

      1. Moin!

        Die Verwendung der oben genannten Variante mit den Raute-Zeichen (#). Ich hab die RFC2141 jetzt nicht im Kopf, dort ist aber das Aussehen der URI festgelegt. Die DTDs von XHTML sehen für das Element A eine Attribut href vom Typ URI vor, der in o.g. RFC festgelegt wird.

        Ich denke, du erzählst hier Unsinn. Die Raute ich  (IMHO auch noch im XHTML) bei Links als Sprungziel für Anker vorgesehen. Die kannst du nicht einfach umwidmen in ein Trennzeichen für URL-Parameter.

        Abgesehen davon definiert RFC 2141 das Aussehen einer URN, nicht einer URI. Die wird in RFC2396 festgelegt.

        Kurze Ergänzung:

        Zitat von http://www.ietf.org/rfc/rfc2141.txt:
        "2.4 Excluded characters
        The following list is included only for the sake of completeness.
        Any octets/characters on this list are explicitly NOT part of the URN
        character set, and if used in an URN, MUST be %encoded:
        <excluded> ::= octets 1-32 (1-20 hex) | "" | """ | "&" | "<"
        | ">" | "[" | "]" | "^" | "`" | "{" | "|" | "}" | "~"                 | octets 127-255 (7F-FF hex)"

        D.h., das &-Zeichen ist explizit verboten. Ein Encoding als %26 bringt jedoch keine erwünschte Wirkung.

        Das &-Zeichen ist als Wert eines Parameterstrings explizit verboten, weil es das Trennzeichen der Parameter ist. Wenn du die Variable namens "gmbh&co" übergeben willst, muß diese "gmbh%3dco" heißen. Gleiches gilt, wenn der Wert einer Variablen ein &-Zeichen enthält.

        Zitat RFC 2396: http://www.ietf.org/rfc/rfc2396.txt
        2.2. Reserved Characters

        Many URI include components consisting of or delimited by, certain
           special characters.  These characters are called "reserved", since
           their usage within the URI component is limited to their reserved
           purpose.  If the data for a URI component would conflict with the
           reserved purpose, then the conflicting data must be escaped before
           forming the URI.

        reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                            "$" | ","

        The "reserved" syntax class above refers to those characters that are
           allowed within a URI, but which may not be allowed within a
           particular component of the generic URI syntax; they are used as
           delimiters of the components described in Section 3.

        3.4. Query Component

        The query component is a string of information to be interpreted by
           the resource.

        query         = *uric

        Within a query component, the characters ";", "/", "?", ":", "@",
           "&", "=", "+", ",", and "$" are reserved.

        Und schließlich schreibt das W3 selbst in http://www.w3.org/TR/2000/REC-xhtml1-20000126/#guidelines:
        C.12 Using Ampersands in Attribute Values

        When an attribute value contains an ampersand, it must be expressed as a character entity reference (e.g. "&"). For example, when the href attribute of the a element refers to a CGI script that takes parameters, it must be expressed as http://my.site.dom/cgi-bin/ myscript.pl?class=guest&name=user rather than as http://my.site.dom/cgi- bin/myscript.pl?class=guest&name=user.

        - Sven Rautenberg

        1. Moin!

          Die Verwendung der oben genannten Variante mit den Raute-Zeichen (#). Ich hab die RFC2141 jetzt nicht im Kopf, dort ist aber das Aussehen der URI festgelegt. Die DTDs von XHTML sehen für das Element A eine Attribut href vom Typ URI vor, der in o.g. RFC festgelegt wird.
          Ich denke, du erzählst hier Unsinn. Die Raute ich  (IMHO auch noch im XHTML) bei Links als Sprungziel für Anker vorgesehen. Die kannst du nicht einfach umwidmen in ein Trennzeichen für URL-Parameter.
          Abgesehen davon definiert RFC 2141 das Aussehen einer URN, nicht einer URI. Die wird in RFC2396 festgelegt.
          Kurze Ergänzung:
          Zitat von http://www.ietf.org/rfc/rfc2141.txt:
          "2.4 Excluded characters
          The following list is included only for the sake of completeness.
          Any octets/characters on this list are explicitly NOT part of the URN
          character set, and if used in an URN, MUST be %encoded:
          <excluded> ::= octets 1-32 (1-20 hex) | "" | """ | "&" | "<"
          | ">" | "[" | "]" | "^" | "`" | "{" | "|" | "}" | "~"                 | octets 127-255 (7F-FF hex)"
          D.h., das &-Zeichen ist explizit verboten. Ein Encoding als %26 bringt jedoch keine erwünschte Wirkung.
          Das &-Zeichen ist als Wert eines Parameterstrings explizit verboten, weil es das Trennzeichen der Parameter ist. Wenn du die Variable namens "gmbh&co" übergeben willst, muß diese "gmbh%3dco" heißen. Gleiches gilt, wenn der Wert einer Variablen ein &-Zeichen enthält.
          Zitat RFC 2396: http://www.ietf.org/rfc/rfc2396.txt
          2.2. Reserved Characters
             Many URI include components consisting of or delimited by, certain
             special characters.  These characters are called "reserved", since
             their usage within the URI component is limited to their reserved
             purpose.  If the data for a URI component would conflict with the
             reserved purpose, then the conflicting data must be escaped before
             forming the URI.
                reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                              "$" | ","
             The "reserved" syntax class above refers to those characters that are
             allowed within a URI, but which may not be allowed within a
             particular component of the generic URI syntax; they are used as
             delimiters of the components described in Section 3.
          3.4. Query Component
             The query component is a string of information to be interpreted by
             the resource.
                query         = *uric
             Within a query component, the characters ";", "/", "?", ":", "@",
             "&", "=", "+", ",", and "$" are reserved.
          Und schließlich schreibt das W3 selbst in http://www.w3.org/TR/2000/REC-xhtml1-20000126/#guidelines:
          C.12 Using Ampersands in Attribute Values
          When an attribute value contains an ampersand, it must be expressed as a character entity reference (e.g. "&"). For example, when the href attribute of the a element refers to a CGI script that takes parameters, it must be expressed as http://my.site.dom/cgi-bin/ myscript.pl?class=guest&name=user rather than as http://my.site.dom/cgi- bin/myscript.pl?class=guest&name=user.

          • Sven Rautenberg

          OK, Ok, OK, ich ziehe alles zurück :-(  Du hast ja sowas von Recht... Korrektes Quellenfinden ist halt doch nicht immer so einfach. Also nochmals Danke & ein schönes WE

          Thomas

  2. Hallo an alle!

    Moin an dich!

    Komischerweise stellt sich der XHTML Validator bei Links mit mehreren Variablen quer.

    Bei einem Link wie z.B.

    <a href="onesite.php?var1=abc&var2=cde&var3=efg">
      Link zu einer Seite mit 3 Variablen
    </a>

    schmeißt (wirft) mir der Validator vor:

    <a href="onesite.php?var1=abc&var2=cde&var3=efg">
                                             ^
    Error: reference not terminated by refc delimiter

    <a href="onesite.php?var1=abc&var2=cde&var3=efg">
                                                      ^
    Error: reference not terminated by refc delimiter

    Überleg mal selbst: Wie schreibt man in HTML ein &-Zeichen?

    Richtig, das heißt &. Auch in Links.

    - Sven Rautenberg

    1. Hallo an alle!
      Moin an dich!
      Komischerweise stellt sich der XHTML Validator bei Links mit mehreren Variablen quer.
      Bei einem Link wie z.B.
      <a href="onesite.php?var1=abc&var2=cde&var3=efg">
        Link zu einer Seite mit 3 Variablen
      </a>
      Überleg mal selbst: Wie schreibt man in HTML ein &-Zeichen?
      Richtig, das heißt &. Auch in Links.

      • Sven Rautenberg

      Danke für den Hinweis - auch wenn es lt. Spezifikation definitiv nicht funktionieren dürfte.

      Schönes WE

      Thomas

      1. Moin!

        Danke für den Hinweis - auch wenn es lt. Spezifikation definitiv nicht funktionieren dürfte.

        Du wirst sicherlich gleich </?m=19711&t=3453> lesen und verstehen, was bei deiner Überlegung falsch ist... :)

        Schönes WE

        Wünsch ich auch!

        - Sven Rautenberg

  3. Danke Sven und Danke Thomas!

    Ich sollte mich Samstag morgens nicht mit solch komplexer Materie beschäftigen ;-)
    Hätte ich wirklich auch selber drauf kommen können.

    Viele Grüße und ein schönes Wochenende wünscht

    Bernhard