【问题标题】:What characters are allowed in an HTML attribute name?HTML 属性名称中允许使用哪些字符?
【发布时间】:2010-10-29 21:16:17
【问题描述】:

在 HTML 属性 name=value 对中,“name”部分允许使用哪些字符? ..... 查看一些common attributes 似乎只使用了字母(az 和 AZ),但还可以允许使用哪些其他字符?...可能是数字(0-9)、连字符(-)、和句点 (.) ... 有这方面的规范吗?

【问题讨论】:

  • 这听起来像是引发 Angular 2 的问题:P

标签: html specifications name-value


【解决方案1】:

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

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

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

【讨论】:

  • 回答我的问题。 “除 ... 之外的所有字符都将被视为属性名称的一部分”——在规范中也能找到此信息,值得称赞!
  • 是的,不要“推它”。一些相当常见的字符必须在 CSS 选择器中转义,其他字符会破坏编辑器的语法突出显示,等等。
  • 作为参考,正则表达式为/([^\t\n\f \/>"'=]+)/
  • “每个标签都有一个固定的有效属性名称列表”——除非标签是custom element。然后你就可以自己定义属性了。
  • 给其他程序员的小提示。如果你有 data-foo 作为属性名,你会遇到 JavaScript 的问题 MyElem.data-foo; 使用 MyElem.getAttribute("data-foo");
【解决方案2】:

假设您谈论的是 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)*

【讨论】:

  • 顺便说一句,并非所有这些规则都适用于浏览器。试试document.body.setAttribute('\u1fff', 1) - 会出错。
【解决方案3】:

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

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

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

对于 HTML5:(spec)

属性名称必须由一个或多个字符组成,而不是空格字符、U+0000 NULL、U+0022 引号 (")、U+0027 APOSTROPHE (')、U+003E GREATER-THAN SIGN (>) , U+002F SOLIDUS (/) 和 U+003D EQUALS SIGN (=) 字符、控制字符和任何非 Unicode 定义的字符。在 HTML 语法中,属性名称,甚至是外来元素的名称,可能是用任意大小写字母组合书写,与属性名称匹配,不区分大小写。

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

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

欢迎自定义元素作者为其元素实现他们喜欢的任何类型的属性,但属性的名称比 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] Nmtoken ::= Nmtoken (#x20 Nmtoken)*

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

【讨论】:

    【解决方案4】:

    也许我遗漏了一些东西,但我相信这个问题是基于错误的假设。在 HTML 中,属性严格按照固定规范为defined。如果您“编造”自己的属性名称,则您不再编写有效的 HTML。

    【讨论】:

    • ...当然,除非您正在创建自定义元素或使用 data-* 属性。
    【解决方案5】:

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

    【讨论】:

    • 结论性的。因此,所有允许的字符都是该文档中存在的字符。谢谢!
    • 这并不完全正确,因为您可以指定自己的data- 属性。
    • @ioquatix — 2009 年确实如此!即使混合了数据属性,它也是规范中定义的一种非常特殊的定制形式。
    猜你喜欢
    • 2011-03-26
    • 2023-04-08
    • 2013-11-15
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多