允许用于CSS标识符的字符

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

是否有我可以用来验证的正则表达式? 它是浏览器不可知论者?


charset无关紧要。 允许的字符更重要。 检查CSS规范。 以下是相关性的一个例子:

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

更新 :至于正则表达式问题,你可以在这里找到语法:

ident      -?{nmstart}{nmchar}*

其中包含的部分:

nmstart    [_a-z]|{nonascii}|{escape}
nmchar     [_a-z0-9-]|{nonascii}|{escape}
nonascii   [240-377]
escape     {unicode}|[^rnf0-9a-f]
unicode    {h}{1,6}(rn|[ trnf])?
h          [0-9a-f]

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

String h = "[0-9a-f]";
String unicode = "\{h}{1,6}(rn|[ trnf])?".replace("{h}", h);
String escape = "({unicode}|\[^rnf0-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的答案的完整表达,取而代之的是:

/-?([_a-z]|[240-377]|([0-9a-f]{1,6}(rn|[ trnf])?|[^rnf0-9a-f]))([_a-z0-9-]|[240-377]|([0-9a-f]{1,6}(rn|[ trnf])?|[^rnf0-9a-f]))*/

使用DEFINE ,我发现它更具可读性:

/(?(DEFINE)
    (?P<h>        [0-9a-f]                             )
    (?P<unicode>  (?&h){1,6}(rn|[ trnf])?        )
    (?P<escape>   ((?&unicode)|[^rnf0-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的原始正则表达式运行的速度是DEFINE表达式的2 DEFINE ,只需要〜23个步骤来识别一个unicode字符,而后者需要大约40个。


这只是对@BalusC答案的贡献。 这是他提供的Java代码的PHP版本,我对它进行了转换,并且我认为别人会发现它有帮助。

$h = "[0-9a-f]";
$unicode = str_replace( "{h}", $h, "{h}{1,6}(rn|[ trnf])?" );
$escape = str_replace( "{unicode}", $unicode, "({unicode}|[^rnf0-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.
链接地址: http://www.djcxy.com/p/22839.html

上一篇: Allowed characters for CSS identifiers

下一篇: css selector to select a table cell contains img