“@”符号是否是有效的HTML/XML标签字符?

11

我正在使用正则表达式进行HTML标签的剥离(是的,我知道,不要使用正则表达式来解析HTML,但是我只是在剥离它,而且我很不幸不能使用任何外部库)。 我正在使用《正则表达式食谱》中的一个正则表达式,它非常有效,但是我遇到了这个问题:

在字符串 Bob Saget <bobs@aol.com> 中,我的正则表达式将电子邮件地址匹配为标签。

所以我的问题是,@符号是有效的XML或HTML标签字符吗?(我不是在问它是否在属性中有效;我知道它有效)如果不是,我将能够在我的正则表达式中成功排除它。

我不确定在哪里查找此信息。我在这里查找这里,我认为那里说在XML中,"@"符号不允许在标签中;但是,我希望有些具体的证据。


1
问题在于您的裸尖括号,应该由实体或字符引用来表示。 '@' 是任何 HTML 变体中都是一个完全有效的字符。 - Kerrek SB
1
@Kerrek 当然,@符号是一个有效的字符。但是在标签中它是否有效呢?如果我给HTML或XML解析器一个带有@符号的标签,它会解析吗? - NickAldwin
“有效标签”是指“有效元素类型名称”吗?答案是否定的,请参见此处以获取有效字符列表。元素类型名称必须是“名称”。引用:“ASCII符号和标点符号以及相当大的一组Unicode符号字符都不包括在名称中[...]”...啊,你已经找到了。 - Kerrek SB
1
@NickAldwin - NameChar规范是一种正式的语法。任何未明确包含在内的内容都被排除在外。您的编辑应该移至答案部分。 - parsifal
Firefox似乎支持它,但只有少数人创建自定义元素,我不认为他们会在标记名称中使用@。不要去掉它们,并对<,>, &进行编码。 - Gerben
1个回答

16

再次查看XML规范后,得知标签由以下内容组成:

'<' Name (S Attribute)* S? '>'

一个名称由以下组成:

NameStartChar (NameChar)*

一个 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]

NameChar由以下内容组成:

NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]

@ 符号的 Unicode 编码是 U+0040

因此,@ 符号在 NameChar 或 NameStartChar 中无效,因此也无效作为名称。


2
不清楚这是否适用于HTML,而您最初的问题是关注在HTML上的。 - BoltClock
1
WhatWG HTML规范只允许[a-zA-Z]作为有效的NameStartChar。对于NameChar,它允许使用[^\s\0>/] - Azmisov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接