2010-05-11 42 views
28

Ký tự (/ đầy đủ) hợp lệ/được cho phép ký tự cho số nhận dạng CSS idclass là gì?Ký tự được phép cho số nhận dạng CSS

Có một cụm từ thông dụng mà tôi có thể sử dụng để xác thực không? Trình duyệt có thuyết bất khả tri không?

+3

có thể trùng lặp của [Ký tự nào hợp lệ trong tên lớp CSS?] (Http://stackoverflow.com/questions/448981/what-characters-are-valid-in-css-class-names) – mercator

+0

@mercator: Cũng bỏ phiếu để đóng. =) –

+2

Câu hỏi này có vẻ trùng lặp với s.o.Q448981: [Ký tự nào hợp lệ trong tên lớp CSS?] (Http://stackoverflow.com/questions/448981/what-characters-are-valid-in-css-class-names) –

Trả lời

41

Bộ ký tự không quan trọng. Các ký tự được phép quan trọng hơn. Kiểm tra CSS specification. Dưới đây là một trích dẫn liên quan:

Trong CSS, định danh (bao gồm tên nguyên tố, các lớp học, và ID trong selectors) có thể chứa những chữ số [a-zA-Z0-9] và ISO 10646 nhân vật U+00A1 và cao hơn, cộng với dấu gạch ngang (-) và gạch dưới (_); chúng không thể bắt đầu bằng một chữ số hoặc dấu gạch ngang được theo sau bởi một chữ số. Định danh cũng có thể chứa các ký tự thoát và bất kỳ ký tự ISO 10646 nào dưới dạng mã số (xem mục tiếp theo). Ví dụ: số nhận dạng "B&W?" có thể được viết là "B\&W\?" hoặc "B\26 W\3F".

Cập nhật: Như cho câu hỏi regex, bạn có thể tìm thấy những ngữ pháp here:

ident  -?{nmstart}{nmchar}* 

nào chứa các bộ phận:

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] 

này có thể được dịch sang một Java regex như sau (Tôi chỉ thêm dấu ngoặc đơn vào các phần chứa OR và thoát các dấu gạch chéo ngược):

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. 

Cập nhật 2: oh, bạn là một PHP'er hơn, tôi nghĩ bạn có thể tìm cách/nơi cần làm str_replace?

+1

"từ định danh" B & W? " có thể được viết là "B \ & W \?" hoặc "B \ 26 W \ 3F" "- Nhưng không ai làm điều đó, và tôi rất vui vì họ không làm như vậy. :-) – amphetamachine

+0

CẢM ƠN BẠN! Thật tuyệt vời! : D Mặc dù nó rất hạn chế nhưng không biết tôi có thể sử dụng '\ 'như một nhân vật trốn thoát. Có ai từng xây dựng một regex để xác thực các ký tự được cho phép không? –

+0

Đó là hoàn hảo, và có tôi có thể con số nó ra. =) Cảm ơn một lần nữa! –

0

Đây chỉ là đóng góp cho câu trả lời @BalusC. Đây là phiên bản PHP của mã Java mà anh ta cung cấp, tôi đã chuyển đổi nó và tôi nghĩ rằng ai đó có thể thấy nó hữu ích.

$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

Đối với bất kỳ ai đang tìm kiếm chìa khóa trao tay nhiều hơn một chút. Khái niệm đầy đủ, thay thế và tất cả, từ @ câu trả lời BalusC là:

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

Và sử dụng DEFINE, mà tôi tìm thấy dễ đọc hơn một chút:

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

Ngẫu nhiên, các biểu thức chính quy ban đầu (và @ con người đóng góp) có một vài ký tự thoát rogue cho phép [ trong tên.

Ngoài ra, cần lưu ý rằng regex thô không có, DEFINE, chạy nhanh gấp 2 lần biểu thức DEFINE, chỉ ~ 23 bước để xác định một ký tự unicode duy nhất, trong khi sau đó mất ~ 40.

Các vấn đề liên quan