回答
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
?
「標識符」B&W?「可以寫成「B \ W \」或「B \ 26 W \ 3F」「 - 但沒有人這樣做,我很高興他們不這樣做。 :-) – amphetamachine 2010-05-11 15:45:21
謝謝!這太棒了! :D雖然它非常有限,但不知道我可以使用'\'作爲轉義字符。有沒有人建立了一個正則表達式來驗證允許的字符? – 2010-05-11 15:46:41
這是完美的,是的,我可以弄明白。 =)再次感謝! – 2010-05-11 17:32:34
這只是對@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.
對於任何尋找一些更多的交鑰匙的東西。充分體現,更換所有,從@ 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。
- 1. CSS允許/不允許字符
- 2. 地圖標識符中允許的字符YAML
- 3. 允許空字符串用於標記PhoneAttribute或UrlAttribute的字段
- 4. C99是否允許在標識符中使用通用字符名稱?
- 5. 不允許字符
- 6. Java關鍵字不允許作爲EL標識符
- 7. 與允許的字符
- 8. 不允許的字符笨
- 9. CookieDecoder中允許的字符
- 10. 只允許數字字符
- 11. 哪些語言允許在標識符中使用空格?
- 12. Base64加密允許字符
- 13. 只允許ASCII字符VBA
- 14. 只允許小寫字符
- 15. 允許在字符名C++
- 16. 只允許某些字符
- 17. 只允許8個字符
- 18. Firebase用戶ID允許的字符
- 19. Google ID允許使用的字符C2DM
- 20. 允許小數點/句點輸入字段允許的字符
- 21. 該語言是否允許將'set'和'get'關鍵字用作標識符?
- 22. 允許使用字母數字,標點符號和空格
- 23. 爲什麼#不允許在標識符中?
- 24. 多部分標識符可以不允許在下述第
- 25. 是否允許全局靜態標識符以單個_開頭?
- 26. 標識中的字符標識
- 27. 允許用空字符串敲除minLength
- 28. codeigniter不允許使用字符錯誤
- 29. 只允許字母數字字符
- 30. 不允許使用標記,等號和分號的字符
可能重複的[什麼字符在CSS類名中有效?](http://stackoverflow.com/questions/448981/what-characters-are-valid-in-css-class-names) – mercator 2010-05-11 15:50:57
@mercator:也投票結束。 =) – 2010-05-11 15:52:32
這個問題似乎是s.o.的重複。Q448981:[什麼字符在CSS類名中有效?](http://stackoverflow.com/questions/448981/what-characters-are-valid-in-css-class-names) – 2010-05-11 15:45:35