允许的CSS标识符
什么是CSS标识符id
和class
的(完整)有效/允许的字符集字符?
有没有一个正则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式运行的速度是DEFINE
expression式的两倍,只需要〜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.