Разрешенные символы для идентификаторов CSS - PullRequest
29 голосов
/ 11 мая 2010

Что такое (полное) допустимое / разрешенное кодировка символов для идентификаторов CSS id и class?

Есть ли регулярное выражение, которое я могу использовать для проверки? Это не зависит от браузера?

Ответы [ 3 ]

45 голосов
/ 11 мая 2010

Кодировка не имеет значения. Разрешенные символы важнее. Проверьте спецификацию CSS . Вот цитата актуальности:

В CSS идентификаторы (включая имена элементов, классы и идентификаторы в селекторах ) могут содержать только символы [a-zA-Z0-9] и ISO 10646 символов U+00A0 и выше плюс дефис (- ) и подчеркивание (_); они не могут начинаться с цифры, двух дефисов или дефиса, за которым следует цифра. Идентификаторы также могут содержать экранированные символы и любые символы ISO 10646 в виде числового кода (см. Следующий пункт). Например, идентификатор "B&W?" может быть записан как "B\&W\?" или "B\26 W\3F".

Обновление : Что касается вопроса о регулярных выражениях, вы можете найти грамматику здесь :

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 следующим образом (я только добавил скобки к частям, содержащим 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'ером, ну, я думаю, вы можете понять, как / где это сделать str_replace?

2 голосов
/ 23 декабря 2016

Для тех, кто ищет что-то еще под ключ. Полное выражение, замененное и все, из ответа @ 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) было несколько неконтролируемых escape-символов, в имени которых допускается [.

Кроме того, следует отметить, что необработанное регулярное выражение без, DEFINE, выполняется примерно в 2 раза быстрее, чем выражение DEFINE, делая всего ~ 23 шага, чтобы идентифицировать один символ Юникода, в то время как последний занимает ~ 40.

1 голос
/ 19 апреля 2016

Это просто вклад в ответ @BalusC. Это PHP-версия Java-кода, который он предоставил, я преобразовал его и подумал, что кто-то другой может найти его полезным.

$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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...