2010-05-11 11 views
28

सीएसएस पहचानकर्ता id और class के लिए (पूर्ण) मान्य/अनुमत वर्णसेट वर्ण क्या हैं?सीएसएस पहचानकर्ताओं के लिए अनुमत वर्ण

क्या कोई नियमित अभिव्यक्ति है जिसका उपयोग मैं सत्यापित करने के लिए कर सकता हूं? क्या यह ब्राउज़र अज्ञेयवादी है?

+3

संभावित डुप्लिकेट [सीएसएस क्लास नामों में कौन से पात्र मान्य हैं?] (Http://stackoverflow.com/questions/448981/what-characters-are-valid-in-css-class-names) – mercator

+0

@mercator: बंद करने के लिए मतदान भी। =) –

+2

यह प्रश्न एसओ का डुप्लिकेट प्रतीत होता है।Q448981: [सीएसएस कक्षा के नामों में कौन से पात्र मान्य हैं?] (Http://stackoverflow.com/questions/448981/what-characters-are-valid-in-css-class-names) –

उत्तर

41

वर्णमाला कोई फर्क नहीं पड़ता। अनुमत वर्ण अधिक मायने रखता है। CSS specification देखें। यहाँ एक प्रासंगिकता के हवाला देते है:

सीएसएस में, पहचानकर्ता (तत्व नाम, वर्ग, और selectors में ID शामिल हैं) केवल वर्ण [a-zA-Z0-9] और आईएसओ 10646 पात्रों U+00A1 और उच्च, के साथ साथ हाइफन (-) और अंडरस्कोर (_); वे अंकों के साथ एक अंक, या एक हाइफ़न के साथ शुरू नहीं कर सकते हैं। पहचानकर्ताओं में भागने वाले वर्ण और किसी भी आईएसओ 10646 वर्ण को संख्यात्मक कोड के रूप में भी शामिल किया जा सकता है (अगला आइटम देखें)। उदाहरण के लिए, पहचानकर्ता "B&W?""B\&W\?" या "B\26 W\3F" के रूप में लिखा जा सकता है।

अद्यतन:

ident  -?{nmstart}{nmchar}* 

कौन सा भागों के होते हैं:: रेगुलर एक्सप्रेशन प्रश्न के रूप में, आप व्याकरण here पा सकते हैं

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] 

यह एक जावा के लिए अनुवाद किया जा सकता निम्नानुसार regex (मैंने केवल 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'er कर रहे हैं, अच्छी तरह से मुझे लगता है कि आप समझ सकते हैं कि कैसे जहां str_replace करने के लिए /?

+1

"पहचानकर्ता" बी और डब्ल्यू? " "बी \ और डब्ल्यू \" या "बी \ 26 डब्ल्यू \ 3 एफ" के रूप में लिखा जा सकता है "- लेकिन कोई भी ऐसा नहीं करता है, और मुझे खुशी है कि वे नहीं करते हैं। :-) – amphetamachine

+0

धन्यवाद! यह बस कमाल है! : डी हालांकि मैं बहुत सीमित था लेकिन मुझे नहीं पता था कि मैं बचने वाले चरित्र के रूप में '\' का उपयोग कर सकता हूं। क्या किसी ने कभी भी अनुमति वर्णों को सत्यापित करने के लिए रेगेक्स बनाया है? –

+0

यह सही है, और हाँ मैं इसे समझ सकता हूं। =) फिर से धन्यवाद! –

0

यह केवल @ बाल्लूसी उत्तर में योगदान है। यह उनके द्वारा प्रदान किए गए जावा कोड का PHP संस्करण है, मैंने इसे परिवर्तित कर दिया और मैंने सोचा कि किसी और को यह उपयोगी लगेगा।

$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

किसी के लिए कुछ और अधिक बारी-बारी की तलाश करने के लिए। पूर्ण अभिव्यक्ति, प्रतिस्थापित और सभी, @ 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 

संयोग से, मूल नियमित अभिव्यक्ति (और @ मानव योगदान) में कुछ दुष्ट बचने वाले पात्र थे जो नाम में की अनुमति देते थे।

इसके अलावा, यह ध्यान दिया जाना चाहिए कि DEFINE के बिना कच्चे रेगेक्स, DEFINE अभिव्यक्ति के रूप में लगभग 2x चलाता है, एक यूनिकोड चरित्र की पहचान करने के लिए केवल ~ 23 कदम उठाते हैं, जबकि बाद में ~ 40 लेता है।

संबंधित मुद्दे