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?
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?
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 enthaltenU+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?
"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
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? –
Das ist perfekt, und ja, ich kann es herausfinden. =) Danke nochmal! –
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.
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.
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
@mercator: Wählt auch, um zu schließen. =) –
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) –