HTML属性名称中允许使用哪些字符?

Rob*_*cks 65 html specifications name-value

在HTML属性名称=值对中,"名称"部分允许的字符是什么?.....看一些常见的属性,似乎只使用字母(az和AZ),但也可以允许其他字符?...可能是数字(0-9),连字符( - )和句点(.)...有什么规格吗?

Alo*_*hci 51

这取决于你所说的"允许".每个标记都有一个固定的属性名称列表,它们是有效的,在html中它们不区分大小写.在一个重要的意义上,只有正确序列中的这些字符才是"允许的".

另一种看待它的方式是浏览器将哪些字符视为有效的属性名称.这里最好的建议来自HTML 5的解析器规范,可以在这里找到:https://html.spec.whatwg.org/multipage/syntax.html#attributes-2

它表示除了制表符,换行符,换页符,空格,固相线,大于符号,引号,撇号和等号之外的所有字符都将被视为属性名称的一部分.就个人而言,我不会尝试推动这种情况.

  • 作为参考,正则表达式将是`/([^\t \n\f\/>"'=] +)/` (23认同)
  • 回答我的问题."除了...之外的所有字符都将被视为属性名称的一部分" - 在查找此信息方面感到荣幸,这在规范中也是如此! (6认同)
  • *"每个标签都有一个固定的属性名称列表,这些属性名称有效"* - 除非标签是[自定义元素](http://www.html5rocks.com/en/tutorials/webcomponents/customelements/).然后您可以自己定义属性. (5认同)
  • 从来没有想过?标记是允许的 (4认同)
  • 给其他程序员的小提示。如果您将`data-foo`作为属性名称,则会遇到JavaScript`MyElem.data-foo;`的麻烦。使用`MyElem.getAttribute(“ data-foo”);` (2认同)
  • @manuell 不,MyElem.dataFoo 会正常工作。虚线条目会自动更改为驼峰式条目。 (2认同)

S.L*_*ott 25

假设您正在谈论XHTML,则适用XML规则.

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

名称和代币

[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)*
Run Code Online (Sandbox Code Playgroud)


Cla*_*ick 15

自从提出这个问题以来,网络已经发展了很多。Web 组件(自定义元素)的作者很可能正在尝试了解在自定义元素上定义属性时可以使用哪些有效名称。

这里有几个答案是部分正确的,所以我将尝试汇总它们并根据最近的规范更新它们。

首先,在 HTML5 中,属性名称可以以大多数字符开头,并且比以前的 HTML 版本更加宽松。@S.Lott 的答案对于 HTML 2 和 XHTML 是正确的,但对于 HTML5 则不正确。

对于 HTML5:(规范

属性名称必须包含一个或多个除空格字符以外的字符、U+0000 NULL、U+0022 QUOTATION MARK (")、U+0027 APOSTROPHE (')、U+003E GREATER-THAN SIGN (>)、U+ 002F SOLIDUS (/), and U+003D EQUALS SIGN (=) 字符,控制字符,以及任何非 Unicode 定义的字符。在 HTML 语法中,属性名称,甚至是外部元素的属性名称,都可以写成小写和大写字母的混合,是属性名称的 ASCII 不区分大小写匹配。

话虽如此,这里的其他评论者是正确的,当在内置元素上使用不在其有效属性列表中的属性时,您在技术上违反了规范。浏览器作者对此有很大的容忍度,因此实际上它不会造成(很多?)伤害。许多库利用它来增强常规 HTML 标签,这会引起一些混乱,因为它在技术上不是有效的 HTML。HTML5 通过使用数据属性命名约定为属性中的自定义数据提供了一种机制。

这些规则对于自定义元素是不同的。

欢迎自定义元素作者为他们的元素实现他们喜欢的任何类型的属性,但属性的名称比 HTML5 更严格。事实上,规范要求属性名称遵循XML Name限制:

ASCII 符号和标点符号以及相当大的一组 Unicode 符号字符被排除在名称之外,因为它们在 XML 名称在 XML 文档之外使用的上下文中作为分隔符更有用;提供这个组为那些上下文提供了关于什么不能成为 XML 名称的一部分的硬保证。字符#x037E(希腊问号)被排除在外,因为标准化后它会变成分号,这可能会改变实体引用的含义。

名称和令牌

[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] 名称 ::= NameStartChar (NameChar)*

[6] 名称 ::= 名称 (#x20 名称)*

[7] Nmtoken ::= (NameChar)+

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

因此,对于自定义元素名称,您可以使用大写/小写字母数字、“_”下划线、“:”冒号或规范中调用的任何 unicode 字符作为起始字符,然后使用破折号“-”、点“。 "、alpha 等...作为正文字符。

  • 做得好。到 2022 年,这仍然是应显示在列表顶部的最新答案。2009 年的两个答案的排名超过 2018 年的这个答案,这并不理想。 (3认同)

Daa*_*aan 9

也许我错过了一些东西,但我相信这个问题是基于错误的假设.在HTML中,根据固定的规范严格定义属性.如果您"组成"自己的属性名称,则不再编写有效的HTML.

  • ...当然,除非您要创建自定义元素或使用data- *属性。 (3认同)