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

时间:2009-05-29 13:34:16

标签: html specifications name-value

在HTML属性 name = value 对中,“name”部分允许的字符是什么? ......看一些common attributes,似乎只使用了字母(az和AZ),但也可以允许其他字符?...可能是数字(0-9),连字符( - )和句号(。)......有没有这个规格?

5 个答案:

答案 0 :(得分:50)

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

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

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

答案 1 :(得分:23)

假设您正在讨论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)*

答案 2 :(得分:9)

也许我错过了什么,但我相信这个问题是基于错误的假设。在HTML中,根据固定的规范,属性严格为defined。如果您“组成”自己的属性名称,则不再编写有效的HTML。

答案 3 :(得分:2)

允许的值列在w3.org。如果添加自定义属性,则不再编写HTML。

答案 4 :(得分:2)

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

这里有一些答案是部分正确的,因此我将尝试汇总它们,并根据最新规范进行更新。

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

对于HTML5:(spec

  

属性名称必须包含一个或多个空格字符以外的字符,U + 0000 NULL,U + 0022引号(“),U + 0027撇号('),U + 003E大于号(>) ,U + 002F SOLIDUS(/)和U + 003D EQUALS SIGN(=)字符,控制字符以及任何未用Unicode定义的字符。在HTML语法中,属性名称(甚至是外来元素的属性名称)可能是用属性名称与ASCII大小写不匹配的小写和大写字母混合编写。

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

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

欢迎自定义元素的作者实现他们喜欢的元素的任何种类的属性,尽管这些属性的名称比HTML5更具限制性。实际上,spec要求属性名称遵循XML Name限制:

  

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

     

名称和令牌

     

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

     

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

     

[7] Nmtoken :: =(NameChar)+

     

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

因此,对于自定义元素名称,您可以使用上/下字母数字,“ _”下划线,“:”冒号或规范中标注的任何Unicode字符作为起始字符,然后用短划线“-”表示,点“。”,字母等...作为正文字符。