Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Allowed characters for CSS identifiers

What are the (full) valid / allowed charset characters for CSS identifiers id and class?

Is there a regular expression that I can use to validate against? Is it browser agnostic?

like image 912
Alix Axel Avatar asked May 11 '10 15:05

Alix Axel


People also ask

What is a CSS identifier?

The CSS ID selector matches an element based on the value of the element's id attribute. In order for the element to be selected, its id attribute must match exactly the value given in the selector.

Which characters are used to prefix IDs in a CSS rule?

The #id selector allows you to target an element by referencing the id HTML attribute. Similar to how class attributes are denoted in CSS with a “period” ( . ) before the class name, ID attributes are prefixed with an “octothorpe” ( # ), more commonly known as a “hash” or “pound sign”.

Can CSS classes have Underscores?

In CSS, one can use underscore(_) instead of hyphen(-) for CSS selectors(class, id, span, …), but preference is given based on its ease to use. Underscores require hitting the Shift key and are therefore harder to type.

What is character used for in CSS *?

Solution. # character is used to create id in CSS.


1 Answers

The charset doesn't matter. The allowed characters matters more. Check the CSS specification. Here's a cite of relevance:

In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F".

Update: As to the regex question, you can find the grammar here:

ident      -?{nmstart}{nmchar}* 

Which contains of the parts:

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] 

This can be translated to a Java regex as follows (I only added parentheses to parts containing the OR and escaped the backslashes):

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. 

Update 2: oh, you're more a PHP'er, well I think you can figure how/where to do str_replace?

like image 130
BalusC Avatar answered Sep 17 '22 16:09

BalusC