URL片段(#)允许使用的字符

28

经过一番搜索,我未能找到一个关于URL片段可以使用哪些字符的好答案。我正在编写一段JavaScript脚本,将利用URL片段。

我希望通过不让URL看起来太复杂,使其更加易于识别。所以我想知道是否可以在URL片段中使用类似“:,?,&或!”这样的字符,但仍然保持其有效性。

我的URL片段应包含以下值:

  • order-by
    • id
    • descasc
  • path
    • /完整/转义/路径/在这里/

http://www.ietf.org/rfc/rfc3986.txt - bmargulies
谢谢bmargulies。但是我仍然无法在该页面中找到URL片段的有效字符。 - Qlii256
请参见2.5和3.5。后者指出任何东西,甚至包括/和?都可以出现。 - bmargulies
对我来说,它只是说允许使用字符/和?(斜杠("/")和问号("?")字符允许在片段标识符中表示数据)。 - Qlii256
2个回答

55

tl;dr

片段标识符组件可以包含以下内容:

  • 0 - 9
  • a - z
  • A - Z
  • ? / : @ - . _ ~ ! $ & ' ( ) * + , ; =
  • 百分号编码的字符(一个%后面跟着两个十六进制数字)

如何查找?

URI标准是STD 66,目前映射到RFC 3986

在这个文档中,您将找到所有需要了解的内容。

片段标识符组件定义在第3.5节中

fragment = *( pchar / "/" / "?" )

这意味着片段可以不包含任何内容或(任意组合):

  • pchar 中定义的字符
  • /
  • ?

pchar的定义

请参考附录A中的内容,了解如何定义pchar

pchar = unreserved / pct-encoded / sub-delims / ":" / "@"

因此,这里添加了以下内容:

  • unreserved中定义的字符
  • pct-encoded中定义的字符
  • sub-delims中定义的字符
  • :
  • @

unreserved的定义

现在查看如何定义unreserved

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

这里添加了以下内容:

  • ALPHA中定义的字符
  • DIGIT中定义的字符
  • -
  • .
  • _
  • ~

ALPHADIGIT的定义

检查一下如何定义ALPHADIGIT。它们没有列在附录中,因为它们来自核心ABNF规则,在第1.3节中解释

ALPHA(字母),[...] DIGIT(十进制数字)[...]

这将添加:

  • a-zA-Z
  • 0-9

pct-encoded的定义

检查pct-encoded的定义:

pct-encoded = "%" HEXDIG HEXDIG

这允许任何百分比编码字符

sub-delims的定义

检查sub-delims的定义:

sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

这将添加:

  • !
  • $
  • &
  • '
  • (
  • )
  • *
  • +
  • ,
  • ;
  • =

一个用于验证片段标识符组件中有效字符的正则表达式在这里非常有用 :-) 有人能提供吗? - Jonas
2
^([-?/:@._~!$&'()*+,;=a-zA-Z0-9]|%[0-9a-fA-F]{2})*$(根据您的正则表达式方言,可能需要进行一些转义。) - zrajm
4
我注意到在片段中,"#"并没有被列为有效字符之一,尽管浏览器似乎允许多个井号存在。 - Michael
请注意,在使用“:”作为ID时,当使用querySelector时需要对其进行转义,即使用\\: - zed

2

要找到有效的字符有点棘手,但是上面注释的文件确实包含了这些信息,如果您深入阅读,就能发现。

可用的字符如下:

  • "!"
  • "$"
  • "&"
  • "'"
  • "("
  • ")"
  • "*"
  • "+"
  • ","
  • ";"
  • "="
  • "?"
  • "@"
  • ALPHA
  • DIGIT
  • "-"
  • "."
  • "_"
  • "~"
  • "%" HEXDIG HEXDIG
  • ":"
  • "/"

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