2010-05-11 13 views
28

Was sind die (vollen) gültigen/zulässigen Zeichensatz Zeichen für CSS-Bezeichner id und class?Erlaubte Zeichen für CSS-IDs

Gibt es einen regulären Ausdruck, mit dem ich validieren kann? Ist es Browser Agnostiker?

+3

mögliche Duplikate von [Welche Zeichen sind in CSS-Klassennamen gültig?] (Http://stackoverflow.com/questions/448981/what-characters-are-valid-in-css-class-names) – mercator

+0

@mercator: Wählt auch, um zu schließen. =) –

+2

Diese Frage scheint ein Duplikat von s.o. zu sein.Q448981: [Welche Zeichen sind in CSS-Klassennamen gültig?] (Http://stackoverflow.com/questions/448981/what-characters-are-valid-in-css-class-names) –

Antwort

41

Der Zeichensatz spielt keine Rolle. Die erlaubten Charaktere sind wichtiger. Überprüfen Sie die CSS specification. Hier ist eine zitieren von Relevanz:

In CSS-IDs (einschließlich Elementnamen, Klassen und IDs in selectors) kann nur die Zeichen [a-zA-Z0-9] und ISO 10646-Zeichen enthalten U+00A1 und höher, sowie der Bindestrich (-) und die Unterstrich (_); Sie können nicht mit einer Ziffer oder einem Bindestrich gefolgt von einer Ziffer beginnen. Bezeichner können auch maskierte Zeichen und jedes ISO 10646-Zeichen als numerischen Code enthalten (siehe nächster Punkt). Zum Beispiel kann die Kennung als "B\&W\?" oder "B\26 W\3F" geschrieben werden.

aktualisieren:

ident  -?{nmstart}{nmchar}* 

Welche enthält der Teile: In Bezug auf die regex Frage, können Sie die Grammatik here finden

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] 

Dies kann zu einem Java übersetzt werden regex wie folgt (Ich habe nur Teile hinzugefügt, die das OR enthalten und die umgekehrten Schrägstriche maskiert haben):

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, du bist mehr ein PHP'er, auch ich denke, man kann Figur, wie/wo str_replace zu tun?

+1

"die Kennung" B & W? " kann geschrieben werden als "B \ & W \?" oder "B \ 26 W \ 3F" "- Aber niemand tut das, und ich bin froh, dass sie es nicht tun. :-) – amphetamachine

+0

DANKE! Das ist einfach großartig! : D Obwohl es sehr begrenzt war, wusste ich nicht, dass ich '\' als Escape-Zeichen verwenden könnte. Hat jemals jemand eine Regex erstellt, um die erlaubten Zeichen zu validieren? –

+0

Das ist perfekt, und ja, ich kann es herausfinden. =) Danke nochmal! –

0

Dies ist lediglich ein Beitrag zur @BalusC Antwort. Es ist die PHP-Version des Java-Codes, die er zur Verfügung gestellt hat, ich habe es konvertiert und ich dachte, jemand anderes könnte es hilfreich finden.

$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. 
1

Für alle auf der Suche nach etwas ein wenig mehr schlüsselfertig. Der vollständige Ausdruck, ersetzt und alle, von @ BalusC Antwort lautet:

/-?([_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]))*/ 

Und DEFINE mit, die ich ein wenig mehr lesbar finden:

/(?(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 

übrigens der ursprüngliche reguläre Ausdruck (und @ menschliche Beitrag) hatte ein paar Rogue Escape-Zeichen, die [ im Namen erlauben.

Außerdem sollte beachtet werden, dass die rohe regex ohne, DEFINE, läuft über 2x so schnell wie der DEFINE Ausdruck, wobei nur ~ 23 Schritte, um ein einzelnes Unicode-Zeichen zu identifizieren, während die später ~ 40 nimmt.

Verwandte Themen