दिलचस्प पोस्ट
स्थितिपट्टी की ऊंचाई? युद्ध फाइलें कैसे तैयार करें एक कॉलम एक चेकबॉक्स बनाओ एंड्रॉइड एसिंक टास्क उदाहरण और स्पष्टीकरण नोटपैड ++ में प्रत्येक स्ट्रिंग में मौजूद सभी स्ट्रिंगों को कैसे बदल सकता है? अप्रबंधित dll को एक प्रबंधित C # dll में एम्बेड करना संस्था फ़्रेमवर्क में संग्रहित प्रक्रियाओं को जटिल प्रकार जोड़ना सिस्टम ओवरले विंडो बनाना (हमेशा शीर्ष पर) कच्चे पोस्ट डेटा प्राप्त करें git submodule अद्यतन केवल शुरू में आवश्यक है? क्यों 'eval' एक बुरा अभ्यास का उपयोग कर रहा है? सीएसएस का इस्तेमाल करते हुए माता-पिता डीआईवी की तुलना में बाल DIV की चौड़ाई व्यापक बनाने का तरीका क्या है? कमांड प्रॉम्प्ट में सी # स्रोत फ़ाइल को संकलित करना / निष्पादित करना मैं दो अलग-अलग डोमेन में कुकीज़ का उपयोग कैसे करूं? पृष्ठ या सामग्री के नीचे स्थित पाद लेख, जो भी कम हो

कैसे स्ट्रिंग एक वैध XML तत्व नाम है की जांच करने के लिए?

मुझे PHP में एक regex या फ़ंक्शन की आवश्यकता है जो एक अच्छा XML तत्व नाम होने के लिए स्ट्रिंग मान्य करेगा।

प्रपत्र w3 स्कूल:

XML तत्वों को इन नामकरण नियमों का पालन करना चाहिए:

  1. नामों में अक्षरों, संख्याओं और अन्य वर्ण शामिल हो सकते हैं
  2. नाम किसी संख्या या विराम चिह्न के साथ शुरू नहीं हो सकते
  3. नाम xml (या XML, या Xml, आदि) अक्षरों से शुरू नहीं हो सकता
  4. नामों में रिक्त स्थान नहीं हो सकते

मैं एक बुनियादी regex लिख सकता हूँ जो नियम 1,2 और 4 की जांच करेगा, लेकिन यह सभी विराम चिह्नों की अनुमति नहीं देगा और तीसरे नियम के लिए खाता नहीं होगा

\w[\w0-9-] 

दोस्ताना अपडेट

अच्छी तरह से बनाई गई XML तत्व नामों के लिए यहां अधिक प्रामाणिक स्रोत है:

नाम और टोकन

 NameStartChar ::= ":" | [AZ] | "_" | [az] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] Name ::= NameStartChar (NameChar)* 

इसके अलावा एक अलग गैर-टोकनित नियम निर्दिष्ट किया गया है:

स्ट्रिंग "एक्सएमएल" के साथ शुरू होने वाले नाम, या किसी भी स्ट्रिंग के साथ जो ('एक्स' | 'एक्स') ('एम' | 'एम') ('एल' | 'एल')) मानकीकरण के लिए आरक्षित हैं इस विनिर्देश के इस या भविष्य के संस्करणों में

वेब के समाधान से एकत्रित समाधान "कैसे स्ट्रिंग एक वैध XML तत्व नाम है की जांच करने के लिए?"

कैसा रहेगा

 /\A(?!XML)[az][\w0-9-]*/i 

उपयोग:

 if (preg_match('/\A(?!XML)[az][\w0-9-]*/i', $subject)) { # valid name } else { # invalid name } 

स्पष्टीकरण:

 \A Beginning of the string (?!XML) Negative lookahead (assert that it is impossible to match "XML") [az] Match a non-digit, non-punctuation character [\w0-9-]* Match an arbitrary number of allowed characters /i make the whole thing case-insensitive 

यदि आप मान्य XML बनाना चाहते हैं, तो DOM एक्सटेंशन का उपयोग करें इस तरह आपको किसी भी रेगेक्स के बारे में चिंता करने की जरूरत नहीं है। अगर आप किसी अमान्य नाम को एक डोमेल्डमेंट में डालते हैं, तो आपको एक त्रुटि मिल जाएगी।

 function isValidXmlName($name) { try { new DOMElement($name); return TRUE; } catch(DOMException $e) { return FALSE; } } 

यह दे देंगे

 var_dump( isValidXmlName('foo') ); // true valid localName var_dump( isValidXmlName(':foo') ); // true valid localName var_dump( isValidXmlName(':b:c') ); // true valid localName var_dump( isValidXmlName('b:c') ); // false assumes QName 

और संभवत: आप जो करना चाहते हैं उसके लिए काफी अच्छा है।

पेडेंटिक नोट 1

स्थानीय नाम और क्यूएन के बीच भेद ध्यान दें। ext / dom मानती है कि आप नामों वाले तत्व का उपयोग कर रहे हैं यदि बृहदान्त्र के पहले एक उपसर्ग है, जो कि नाम कैसे बन सकता है, के संबंध में बाधाएं जोड़ता है। तकनीकी तौर पर, बी: बी एक वैध स्थानीय नाम है, क्योंकि नामांकित ग्राहक नाम का हिस्सा है । यदि आप इन को शामिल करना चाहते हैं, तो फ़ंक्शन को बदलें

 function isValidXmlName($name) { try { new DOMElement( $name, null, strpos($name, ':') >= 1 ? 'http://example.com' : null ); return TRUE; } catch(DOMException $e) { return FALSE; } } 

पेडेंटिक नोट 2

ध्यान दें कि तत्व "xml" से शुरू हो सकते हैं डब्ल्यू 3 स्कूल (जो डब्ल्यू 3 सी से संबद्ध नहीं है) जाहिरा तौर पर यह हिस्सा गलत हो गया ( पहली बार नहीं होगा )। यदि आप वास्तव में एक्सएमएल ऐड के साथ शुरू होने वाले तत्वों को बाहर करना चाहते हैं

 if(stripos($name, 'xml') === 0) return false; 

try/catch से पहले

इस तथ्य के बावजूद यह अभी तक याद किया गया है कि सवाल यह पुराना है: PHP के पीक्रर फ़ंक्शंस के माध्यम से नाम सत्यापन, जो एक्सएमएल विनिर्देश के साथ सुव्यवस्थित हैं।

एक्सएमएल की परिभाषा में यह तत्व के बारे में स्पष्ट है चश्मा ( एक्स्टेंसिबल मार्कअप लैंग्वेज (XML) 1.0 (पांचवीं संस्करण) ):

 [4] NameStartChar ::= ":" | [AZ] | "_" | [az] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] [4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] [5] Name ::= NameStartChar (NameChar)* 

इस नोटेशन को यूटीएफ -8 संगत रेगुलर एक्सप्रेशन में preg_match साथ प्रयोग किया जा सकता है, यहां पर एकल-उद्धृत PHP स्ट्रिंग के रूप में शब्दशः कॉपी किया जाना है:

 '~^[:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}][:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}.\\-0-9\\xB7\\x{0300}-\\x{036F}\\x{203F}-\\x{2040}]*$~u' 

या अधिक पठनीय रूप में नामित सबपाटन के साथ दूसरे संस्करण के रूप में:

 '~ # XML 1.0 Name symbol PHP PCRE regex <http://www.w3.org/TR/REC-xml/#NT-Name> (?(DEFINE) (?<NameStartChar> [:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}]) (?<NameChar> (?&NameStartChar) | [.\\-0-9\\xB7\\x{0300}-\\x{036F}\\x{203F}-\\x{2040}]) (?<Name> (?&NameStartChar) (?&NameChar)*) ) ^(?&Name)$ ~ux' 

ध्यान दें कि इस पैटर्न में बृहदान्त्र होता है : जो आपको एक्सएमएल नेमस्पेस सत्यापन के कारणों (उदाहरण के लिए NCName लिए एक परीक्षण) के लिए बाहर जाना चाहते हैं (पहले पैटर्न में दो अपीलें, एक दूसरे में)।

उपयोग उदाहरण:

 $name = '::...'; $pattern = '~ # XML 1.0 Name symbol PHP PCRE regex <http://www.w3.org/TR/REC-xml/#NT-Name> (?(DEFINE) (?<NameStartChar> [:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}]) (?<NameChar> (?&NameStartChar) | [.\\-0-9\\xB7\\x{0300}-\\x{036F}\\x{203F}-\\x{2040}]) (?<Name> (?&NameStartChar) (?&NameChar)*) ) ^(?&Name)$ ~ux'; $valid = 1 === preg_match($pattern, $name); # bool(true) 

यह कह रहा है कि XML (कम या अपरकेस अक्षरों में) से शुरू होने वाला कोई तत्व नाम संभव नहीं होगा, सही नहीं है। <XML/> एक बिल्कुल अच्छी तरह से बनाई गई XML और XML एक बिल्कुल अच्छी तरह से बनाई गई तत्व का नाम है

यह केवल ऐसा नाम है कि मानकीकरण (XML संस्करण 1.0 और ऊपर) के लिए आरक्षित आरक्षित नामों के सबसेट में हैं। यह जांचना आसान है कि क्या (अच्छी तरह से बनाई गई) तत्व का नाम स्ट्रिंग तुलना के साथ आरक्षित है:

 $reserved = $valid && 0 === stripos($name, 'xml')); 

या वैकल्पिक रूप से एक अन्य नियमित अभिव्यक्ति:

 $reserved = $valid && 1 === preg_match('~^[Xx][Mm][Ll]~', $name); 

PHP के DOMDocument आरक्षित नामों के लिए परीक्षण नहीं कर सकता I कम से कम मुझे यह नहीं पता कि यह कैसे करना है और मैं बहुत कुछ देख रहा हूं

एक मान्य तत्व नाम को एक अनन्य तत्व प्रकार घोषणापत्र की आवश्यकता है, जो कि प्रश्न के दायरे से बाहर नहीं है जैसा कोई घोषणा नहीं हुई है। इसलिए उत्तर उस का ख्याल नहीं रखता है यदि कोई तत्व प्रकार की घोषणा होगी, तो आपको केवल सभी (केस-संवेदी) नामों की एक सफेद-सूची के खिलाफ मान्य करने की आवश्यकता होगी, इसलिए यह एक साधारण केस-सेंसिस्ट स्ट्रिंग-तुलना होगी।


भ्रमण: DOMDocument क्या नियमित अभिव्यक्ति से अलग करता है?

एक DOMDocument / DOMElement साथ तुलना में, कुछ अंतर हैं जो वैध तत्व नाम की योग्यता प्राप्त करते हैं। DOM एक्सटेंशन किसी प्रकार के मिश्रित-मोड में होता है जो इसे मान्य करता है जो इसे मान्य करता है। निम्नलिखित भ्रमण व्यवहार को दिखाता है और दिखाता है कि उसे कैसे नियंत्रित किया जाए।

आइए $name लेते हैं और तत्व को तत्त्व देते हैं:

 $element = new DOMElement($name); 

परिणाम निर्भर करता है:

  • अगर पहला अक्षर एक बृहदान्त्र है, तो यह केवल XML 1.0 Name प्रतीक को मान्य करता है
  • यदि पहला अक्षर एक बृहदान्त्र नहीं है, तो यह XMLNS 1.0 QName प्रतीक को मान्य करता है

तो पहला अक्षर तुलना मोड के बारे में फैसला करता है।

एक नियमित अभिव्यक्ति विशेष रूप से लिखा गया है कि यहां क्या जांचना है, यहां XML 1.0 Name प्रतीक है।

बृहदान्त्र के साथ नाम को प्रीफ़िक्स करने से आप इसे DOMElement साथ प्राप्त कर सकते हैं:

 function isValidXmlName($name) { try { new DOMElement(":$name"); return TRUE; } catch (DOMException $e) { return FALSE; } } 

QName स्पष्ट रूप से जांच करने के लिए इसे इसे PrefixedName में बदलकर प्राप्त किया जा सकता है, यदि यह UnprefixedName :

 function isValidXmlnsQname($qname) { $prefixedName = (!strpos($qname, ':') ? 'prefix:' : '') . $qname; try { new DOMElement($prefixedName, NULL, 'uri:ns'); return TRUE; } catch (DOMException $e) { return FALSE; } } 

मेरे अच्छे उत्तर से प्रेरित होकर, लेकिन '$' समाप्त हो रहा है (अन्यथा XML नामों में 'एएए बीबीबी' जैसे रिक्त स्थान शामिल होंगे)

 $validXmlName = (preg_match('/^(?!XML)[az][\w0-9-]*$/i', $subject) != 0); 

इस regex का उपयोग करें:

? ^ _ ((xml |?! [_ \ घ \ डब्ल्यू])) ([\ w .-] +) $

यह आपके सभी चार अंकों से मेल खाता है और यूनिकोड वर्णों की अनुमति देता है।

यदि आप डॉटनेट ढांचे का उपयोग कर रहे हैं तो XmlConvert.VerifyName का प्रयास करें। यह आपको बताएगा कि नाम मान्य है, या एक अवैध नाम को वैध में परिवर्तित करने के लिए XmlConvert.EncodeName का उपयोग करें …

नीचे अभिव्यक्ति को XML को छोड़कर मान्य यूनिकोड तत्व नाम से मेल खाना चाहिए। Xml के साथ शुरू या समाप्त होने वाले नामों को अब भी अनुमति दी जाएगी। यह @ टूस्चो के परीक्षण परीक्षा पास करता है एक बात मैं एक regex समझ नहीं सका विस्तारक था। एक्सएमएल तत्व नाम का विवरण कहता है:

[4] नामचिह्न :: = पत्र | अंक | '।' | '-' | '_' | ':' | मेल | भरनेवाला

[5] नाम :: = (पत्र | '_' | ':' '(नामचिह्न) *

लेकिन एक यूनिकोड श्रेणी या कक्षा वाले विस्तारक के लिए कोई स्पष्ट परिभाषा नहीं है।

 ^[\p{L}_:][\p{N}\p{L}\p{Mc}.\-|:]*((?<!xml)|xml)$ 

एक्सएमएल, एक्सएमएल और आदि वैध टैग हैं, वे अभी "इस विनिर्देश के इस या भविष्य के संस्करणों में मानकीकरण के लिए आरक्षित हैं" जो संभवत: कभी नहीं होगा। कृपया https://www.w3.org/TR/REC-xml/ पर वास्तविक मानक की जांच करें । W3school लेख गलत है

यह आपको मोटे तौर पर आपको क्या चाहिए [मान लें कि आप यूनिकोड का प्रयोग कर रहे हैं]:
( नोट: यह पूरी तरह से अनचाहे नहीं है।)

 [^\p{P}xX0-9][^mMlL\s]{2}[\w\p{P}0-9-] 

\p{P} , PHP की नियमित अभिव्यक्ति वाक्यविन्यास में यूनिकोड विराम चिह्न के लिए वाक्यविन्यास है।

 if (substr(strtolower($text), 0, 3) != 'xml') && (1 === preg_match('/^\w[^<>]+$/', $text))) { // valid; }