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


70

在HTML属性名称=值对中,“名称”部分允许使用哪些字符?.....看一些常见的属性,似乎只使用字母(az和AZ),但是还可以允许其他字符吗?...也许是数字(0-9),连字符(-)和句点(。)...对此有任何规范吗?


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

Answers:


55

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

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

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


7
回答我的问题。“除了...以外的所有字符都将被视为属性名称的一部分” –在查找此信息时也很荣幸,在规范中也是如此!
罗宾·罗德里克斯

是的,不要“推”它。一些比较常用的字符将在CSS选择器进行转义,别人会打破你的语法编辑器等的凸显
罗尔夫

25
供参考,正则表达式为/([^\t\n\f \/>"'=]+)/
Nate 2014年

6
“每个标签都有一个有效的固定名称列表” –除非标签是一个自定义元素。然后,您可以自己定义属性。
tomekwi 2015年

4
给其他程序员的小提示。如果你有data-foo作为属性名,你就必须使用JavaScript麻烦MyElem.data-foo;使用MyElem.getAttribute("data-foo");
manuell

27

假设您在谈论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)-这会出错。
dy_

10

自从提出这个问题以来,网络已经发展了很多。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通过使用数据属性命名约定为属性中的自定义数据提供了一种机制。

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

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

名称中排除了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] Nmtokens :: = Nmtoken(#x20 Nmtoken)*

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


8

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


6
...当然,除非您要创建自定义元素或使用data- *属性。
leviathanbadger

1

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


确凿。因此,所有允许的字符都是该文档中存在的字符。谢谢!
罗宾·罗德里克斯

6
这不是完全正确的,因为您可以指定自己的data-属性。
ioquatix '16

1
@ioquatix-2009年确实如此!即使在混合使用数据属性的情况下,它也是规范中定义的一种非常特殊的自定义形式。
昆汀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.