允许的CSS标识符

什么是CSS标识符idclass的(完整)有效/允许的字符集字符?

有没有一个正则expression式,我可以用来validation? 它是浏览器不可知论者?

charset并不重要。 允许的字符更重要。 检查CSS规范 。 这里有一个相关的例子:

在CSS中,标识符(包括元素名称,类和select器中的 ID)只能包含字符[a-zA-Z0-9]和ISO 10646字符U+00A1及更高版本,连字符( - )和下划线_ ); 他们不能以数字或连字符后跟数字开始。 标识符也可以包含转义字符和任何ISO 10646字符作为数字代码(参见下一项)。 例如,标识符"B&W?" 可以写成"B\&W\?""B\26 W\3F"

更新 :至于正则expression式的问题,你可以在这里find语法:

 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正则expression式,如下所示(我只是将括号添加到包含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

对于任何寻找更多的交钥匙的人来说。 从@ BalusC的回答中,完整的expression,取而代之的是:

 /-?([_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 

顺便说一句,原来的正则expression式(和@人类的贡献)有一些stream氓转义字符,允许[名称。

此外,应该指出的是,没有DEFINE的原始正则expression式运行的速度是DEFINEexpression式的两倍,只需要〜23个步骤来识别一个unicode字符,而后者需要约40次。

这只是对@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.