CSS标识符id
和class
的(完整)有效/允许字符集字符是什么?
是否有可用于验证的正则表达式?浏览器不可知吗?
答案 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.