2010-05-11 51 views
28

什麼是(完整)有效/允許 字符集 用於CSS標識符的字符idclass允許用於CSS標識符的字符

有沒有一個正則表達式可以用來驗證?它是瀏覽器不可知論者?

+3

可能重複的[什麼字符在CSS類名中有效?](http://stackoverflow.com/questions/448981/what-c​​haracters-are-valid-in-css-class-names) – mercator 2010-05-11 15:50:57

+0

@mercator:也投票結束。 =) – 2010-05-11 15:52:32

+2

這個問題似乎是s.o.的重複。Q448981:[什麼字符在CSS類名中有效?](http://stackoverflow.com/questions/448981/what-c​​haracters-are-valid-in-css-class-names) – 2010-05-11 15:45:35

回答

41

charset無關緊要。允許的字符更重要。檢查CSS specification。這裏有一個引用的相關性:

在CSS中,標識符(包括元素名稱,類別,並在selectors標識)只能包含字符[a-zA-Z0-9]和ISO 10646個字符U+00A1高,加上連字符(-)和下劃線(_);他們不能以數字或連字符後跟數字開頭。標識符也可以包含轉義字符和任何ISO 10646字符作爲數字代碼(參見下一項)。例如,標識符"B&W?"可以寫爲"B\&W\?""B\26 W\3F"

更新:至於正則表達式的問題,你可以找到語法here

ident  -?{nmstart}{nmchar}* 

其中包含幾部分組成:

nmstart [_a-z]|{nonascii}|{escape} 
nmchar  [_a-z0-9-]|{nonascii}|{escape} 
nonascii [\240-\377] 
escape  {unicode}|\\[^\r\n\f0-9a-f] 
unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])? 
h   [0-9a-f] 

這可以轉換成Java正則表達式如下(我只在括有OR的部分加上括號,並且跳過了反斜槓):

String h = "[0-9a-f]"; 
String unicode = "\\\\{h}{1,6}(\\r\\n|[ \\t\\r\\n\\f])?".replace("{h}", h); 
String escape = "({unicode}|\\\\[^\\r\\n\\f0-9a-f])".replace("{unicode}", unicode); 
String nonascii = "[\\240-\\377]"; 
String nmchar = "([_a-z0-9-]|{nonascii}|{escape})".replace("{nonascii}", nonascii).replace("{escape}", escape); 
String nmstart = "([_a-z]|{nonascii}|{escape})".replace("{nonascii}", nonascii).replace("{escape}", escape); 
String ident = "-?{nmstart}{nmchar}*".replace("{nmstart}", nmstart).replace("{nmchar}", nmchar); 

System.out.println(ident); // The full regex. 

更新2:哦,你更多的是PHP'er,以及我認爲你可以弄清楚如何/在哪裏做str_replace

+1

「標識符」B&W?「可以寫成「B \ W \」或「B \ 26 W \ 3F」「 - 但沒有人這樣做,我很高興他們不這樣做。 :-) – amphetamachine 2010-05-11 15:45:21

+0

謝謝!這太棒了! :D雖然它非常有限,但不知道我可以使用'\'作爲轉義字符。有沒有人建立了一個正則表達式來驗證允許的字符? – 2010-05-11 15:46:41

+0

這是完美的,是的,我可以弄明白。 =)再次感謝! – 2010-05-11 17:32:34

0

這只是對@BalusC答案的貢獻。這是他提供的Java代碼的PHP版本,我對它進行了轉換,並且我認爲別人會發現它有幫助。

$h = "[0-9a-f]"; 
$unicode = str_replace("{h}", $h, "\{h}{1,6}(\r\n|[ \t\r\n\f])?"); 
$escape = str_replace("{unicode}", $unicode, "({unicode}|\[^\r\n\f0-9a-f])"); 
$nonascii = "[\240-\377]"; 
$nmchar = str_replace(array("{nonascii}", "{escape}"), array($nonascii, $escape), "([_a-z0-9-]|{nonascii}|{escape})"); 
$nmstart = str_replace(array("{nonascii}", "{escape}"), array($nonascii, $escape), "([_a-z]|{nonascii}|{escape})"); 
$ident = str_replace(array("{nmstart}", "{nmchar}"), array($nmstart, $nmchar), "-?{nmstart}{nmchar}*"); 


echo $ident; // The full regex. 
1

對於任何尋找一些更多的交鑰匙的東西。充分體現,更換所有,從@ BalusC的回答是:

/-?([_a-z]|[\240-\377]|([0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|[^\r\n\f0-9a-f]))([_a-z0-9-]|[\240-\377]|([0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|[^\r\n\f0-9a-f]))*/ 

而且使用DEFINE,我覺得這一點更具可讀性:

/(?(DEFINE) 
    (?P<h>  [0-9a-f]       ) 
    (?P<unicode> (?&h){1,6}(\r\n|[ \t\r\n\f])?  ) 
    (?P<escape> ((?&unicode)|[^\r\n\f0-9a-f])*  ) 
    (?P<nonascii> [\240-\377]       ) 
    (?P<nmchar> ([_a-z0-9-]|(?&nonascii)|(?&escape))) 
    (?P<nmstart> ([_a-z]|(?&nonascii)|(?&escape)) ) 
    (?P<ident> -?(?&nmstart)(?&nmchar)*   ) 
) (?: 
    (?&ident) 
)/x 

順便說一下,原來的正則表達式(和@人的貢獻)有幾個流氓轉義字符,允許名稱中包含[

此外,應當注意,如果沒有,DEFINE原始的正則表達式,運行約2倍一樣快DEFINE表達,只服用〜23的步驟,以識別單個Unicode字符,而後來發生〜40。