Welche Zeichen sind in einem HTML-Attributnamen zulässig?

70

Welche Zeichen sind in HTML-Attributname = Wert- Paaren für den Teil 'Name' zulässig? ..... Bei Betrachtung einiger allgemeiner Attribute scheint es, dass nur Buchstaben (az und AZ) verwendet werden, aber welche anderen Zeichen könnten auch erlaubt sein? ... vielleicht Ziffern (0-9), Bindestriche (-) und Perioden (.) ... gibt es dafür eine Spezifikation?

Robin Rodricks
quelle
2
Dies klingt wie die Frage, die Angular 2: P
Matt Lyons

Antworten:

55

Es kommt darauf an, was Sie unter "erlaubt" verstehen. Jedes Tag hat eine feste Liste von Attributnamen, die gültig sind, und in HTML wird die Groß- und Kleinschreibung nicht berücksichtigt. In einem wichtigen Sinne sind nur diese Zeichen in der richtigen Reihenfolge "erlaubt".

Eine andere Sichtweise ist, welche Zeichen Browser als gültigen Attributnamen behandeln. Der beste Rat hier stammt aus der Parser-Spezifikation von HTML 5, die hier zu finden ist: https://html.spec.whatwg.org/multipage/syntax.html#attributes-2

Es heißt, dass alle Zeichen außer Tabulator, Zeilenvorschub, Formularvorschub, Leerzeichen, Solidus, Größer als Vorzeichen, Anführungszeichen, Apostroph und Gleichheitszeichen als Teil des Attributnamens behandelt werden. Persönlich würde ich jedoch nicht versuchen, die Randfälle zu verschieben.

Alohci
quelle
7
Beantworte meine Frage. "Alle Zeichen außer ... werden als Teil des Attributnamens behandelt" - Ein großes Lob beim Auffinden dieser Informationen, auch in einer Spezifikation!
Robin Rodricks
Ja, nicht "schieben". Einige häufig verwendete Zeichen müssen in CSS-Selektoren maskiert werden, andere unterbrechen die Syntaxhervorhebung Ihres Editors usw.
Rolf
25
Als Referenz wäre der reguläre Ausdruck/([^\t\n\f \/>"'=]+)/
Nate
6
"Jedes Tag hat eine feste Liste von gültigen Attributnamen" - es sei denn, das Tag ist ein benutzerdefiniertes Element . Dann können Sie Attribute selbst definieren.
Tomékwi
4
Kleiner Hinweis für Programmierkollegen. Wenn Sie data-fooals Attributname haben, haben Sie Probleme mit der MyElem.data-foo;Verwendung von JavaScriptMyElem.getAttribute("data-foo");
manuell
27

Angenommen, Sie sprechen von XHTML, gelten die XML-Regeln.

Siehe http://www.w3.org/TR/2008/REC-xml-20081126/#NT-Name

Namen und Token

[4]     NameStartChar      ::=      ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a]    NameChar       ::=      NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[5]     Name       ::=      NameStartChar (NameChar)*
[6]     Names      ::=      Name (#x20 Name)*
[7]     Nmtoken    ::=      (NameChar)+
[8]     Nmtokens       ::=      Nmtoken (#x20 Nmtoken)*
S.Lott
quelle
Übrigens funktionieren nicht alle diese Regeln im Browser. Versuchen Sie document.body.setAttribute('\u1fff', 1)- das wird ein Fehler sein.
dy_
10

Seit diese Frage gestellt wurde, hat sich das Web ziemlich weiterentwickelt. Es ist wahrscheinlich, dass Autoren von Webkomponenten (benutzerdefinierte Elemente) hier landen, um herauszufinden, welche gültigen Namen beim Definieren von Attributen für benutzerdefinierte Elemente verwendet werden können.

Es gibt hier einige Antworten, die teilweise richtig sind, daher werde ich versuchen, sie zu aggregieren und basierend auf den neuesten Spezifikationen zu aktualisieren.

Erstens können Attributnamen in HTML5 mit den meisten Zeichen beginnen und sind viel freizügiger als in früheren HTML-Versionen. Die Antwort von @ S.Lott ist korrekt für HTML 2 und XHTML, jedoch nicht für HTML5.

Für HTML5: ( spec )

Attributnamen müssen aus einem oder mehreren anderen Zeichen als den Leerzeichen U + 0000 NULL, U + 0022 QUOTATION MARK ("), U + 0027 APOSTROPHE ('), U + 003E GREATER-THAN SIGN (>), U + bestehen 002F SOLIDUS (/) und U + 003D EQUALS SIGN (=) Zeichen, die Steuerzeichen und alle Zeichen, die nicht durch Unicode definiert sind. In der HTML-Syntax können Attributnamen, auch für Fremdelemente, mit beliebigen Zeichen geschrieben werden Mischung aus Klein- und Großbuchstaben, bei denen die ASCII-Groß- und Kleinschreibung nicht mit dem Namen des Attributs übereinstimmt.

Abgesehen davon sind andere Kommentatoren hier korrekt. Wenn Sie ein Attribut für ein integriertes Element verwenden, das nicht in der Liste der gültigen Attribute enthalten ist, verstoßen Sie technisch gegen die Spezifikation. Browser-Autoren haben jedoch eine große Toleranz dafür, so dass es in der Praxis nicht (viel?) Schaden anrichtet. Viele Bibliotheken nutzen dies, um reguläre HTML-Tags zu verbessern, was zu Verwirrung führt, da es sich technisch gesehen nicht um gültiges HTML handelt. HTML5 bietet einen Mechanismus für benutzerdefinierte Daten in Attributen unter Verwendung der Namenskonvention für Datenattribute.

Diese Regeln unterscheiden sich für benutzerdefinierte Elemente.

Benutzerdefinierte Elementautoren können beliebige Attribute für ihr Element implementieren. Die Namen der Attribute sind jedoch restriktiver als bei HTML5. Tatsächlich erfordert die Spezifikation , dass der Attributname den Einschränkungen des XML-Namens entspricht :

Die ASCII-Symbole und Satzzeichen sowie eine relativ große Gruppe von Unicode-Symbolzeichen werden von Namen ausgeschlossen, da sie als Trennzeichen in Kontexten nützlicher sind, in denen XML-Namen außerhalb von XML-Dokumenten verwendet werden. Wenn Sie diese Gruppe bereitstellen, erhalten diese Kontexte harte Garantien dafür, was nicht Teil eines XML-Namens sein kann. Das Zeichen # x037E, GREEK QUESTION MARK, wird ausgeschlossen, da es bei Normalisierung zu einem Semikolon wird, das die Bedeutung von Entitätsreferenzen ändern kann.

Namen und Token

[4] NameStartChar :: = ":" | [AZ] | "_" | [az] | [# xC0- # xD6] | [# xD8- # xF6] | [# xF8- # x2FF] | [# x370- # x37D] | [# x37F- # x1FFF] | [# x200C- # x200D] | [# x2070- # x218F] | [# x2C00- # x2FEF] | [# x3001- # xD7FF] | [# xF900- # xFDCF] | [# xFDF0- # xFFFD] | [# x10000- # xEFFFF]

[4a] NameChar :: = NameStartChar | "-" | "." | [0-9] | # xB7 | [# x0300- # x036F] | [# x203F- # x2040]

[5] Name :: = NameStartChar (NameChar) *

[6] Namen :: = Name (# x20 Name) *

[7] Nmtoken :: = (NameChar) +

[8] Nmtokens :: = Nmtoken (# x20 Nmtoken) *

Für benutzerdefinierte Elementnamen können Sie also den oberen / unteren alphanumerischen Wert, den Unterstrich "_", den Doppelpunkt ":" oder eines der in der Spezifikation genannten Unicode-Zeichen als Startzeichen verwenden und dann "-", Punkte "einfügen. ", alpha etc ... als Körperzeichen.

Clayton Gulick
quelle
8

Vielleicht fehlt mir etwas, aber ich glaube, die Frage basiert auf einer falschen Annahme. In HTML, sind Attribute streng definiert nach einer festgelegten Spezifikation. Wenn Sie Ihre eigenen Attributnamen "erfinden", schreiben Sie kein gültiges HTML mehr.

Daan
quelle
6
... es sei denn, Sie erstellen ein benutzerdefiniertes Element oder verwenden Daten- * Attribute.
Leviathanbadger
1

Die zulässigen Werte sind auf w3.org aufgeführt . Wenn Sie ein benutzerdefiniertes Attribut hinzufügen, schreiben Sie kein HTML mehr.

QUentin
quelle
Schlüssig. Alle zulässigen Zeichen sind also die in diesem Dokument enthaltenen. Vielen Dank!
Robin Rodricks
6
Dies ist nicht ganz richtig, da Sie Ihre eigenen data-Attribute angeben können .
Ioquatix
1
@ioquatix - Es war wahr im Jahr 2009! Und selbst mit Datenattributen im Mix ist dies eine sehr spezifische Form der Anpassung, die in der Spezifikation definiert ist.
Quentin