CSS标识符的允许字符

时间:2010-05-11 15:39:20

标签: css regex validation

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

是否有可用于验证的正则表达式?浏览器不可知吗?

3 个答案:

答案 0 :(得分:44)

字符集并不重要。允许的角色更重要。检查CSS specification。这是一个相关的引用:

  

在CSS中,标识符(包括selectors中的元素名称,类和ID)只能包含字符[a-zA-Z0-9]和ISO 10646字符U+00A0及更高版本以及连字符({ {1}})和下划线(-);它们不能以数字,两个连字符或连字符后跟数字开头。标识符还可以包含转义字符和任何ISO 10646字符作为数字代码(请参阅下一项)。例如,标识符_可以写为"B&W?""B\&W\?"

更新:关于正则表达式问题,您可以找到语法here

"B\26 W\3F"

其中包含部分:

ident      -?{nmstart}{nmchar}*

这可以转换为Java正则表达式如下(我只将括号添加到包含OR的部分并转义反斜杠):

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]

更新2 :哦,你更像是一个PHP,我认为你可以知道如何/在哪里做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.

答案 1 :(得分:2)

对于任何寻找更多交钥匙的人来说。来自@ 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

顺便提一下,原始的正则表达式(和@ human的贡献)有一些流氓转义字符,允许在名称中使用[

此外,应该注意的是,没有DEFINE的原始正则表达式运行速度大约是DEFINE表达式的2倍,仅需要~23步即可识别单个unicode字符,而后者需要~40。

答案 2 :(得分:1)

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