我的調查結果,到目前爲止:
首先是寫一個有效的HTML屬性值的規則:但是這裏的標準只要求(如果要是用引號括起來的屬性值)任意CDATA(實際上是一種%URI,但是HTML本身並沒有在其級別上進行額外的驗證:任何CDATA都會驗證)。
一些例子:
<a href="javascript:alert('Hi!')"> (1)
<a href="javascript:if(a > b && 1 < 0) alert( b ? 'hi' : 'bye')"> (2)
<a href="javascript:if(a>b &&& 1 < 0) alert(b ? 'hi' : 'bye')"> (3)
實施例(1)是有效的。但是例子(2)也是有效的HTML 4.01 Strict。爲了使XHTML有效,我們只需要轉義XML特殊字符< > &
(示例3是有效的XHTML 1.0 Strict)。
現在,示例(2)有效的javascript:
URI?我不確定,但我會說這不是。
從RFC 2396:一個URI受到一些額外的限制,特別是通過%xx
序列的escape/unescape。並且一些字符總是被禁止的: 其中的空格和{}#
。
RFC還定義了opaque URIs
的一個子集:那些沒有分層組件並且分隔字符沒有特殊含義的子集(例如,它們沒有'查詢字符串',所以可以使用?
作爲任何非特殊字符)。我認爲其中應該考慮使用javascript:
URI。
這將意味着一個javascript:
URI的「體」內的有效字符
a-zA-Z0-9
_|. !~*'();?:@&=+$,/-
%hh : (escape sequence, with two hexadecimal digits)
與它不能與/
開始額外的限制。 此劇照留下了一些「重要」的ASCII字符,例如
{}#[]<>^\
而且%
(因爲它使用轉義序列),雙引號"
和(最重要的),全部爲空白。
在某些方面,這看起來相當寬容:重要的是要注意+
是有效的(因此,當解碼時,它不應該是'未轉義',作爲空間)。
但在其他方面,它似乎太嚴格了。大括號和括號,特別是:我明白,他們通常使用非轉義和瀏覽器沒有問題。
那麼空間呢?作爲大括號,它們被RFC所禁止,但我在這種URI中看不到任何問題。但是,我發現在大多數小書籤中,它們被轉義爲「%20」。有沒有(經驗或理論)的解釋呢?
我仍然不知道是否有一些標準函數來使這個escape/unescape(在主流語言)或一些示例代碼。