Xml में सीडीएटीए एंड टोकन से बचने का कोई तरीका है?




escaping cdata (7)

PHP में एक क्लीनर तरीका:

   function safeCData($string)
   {
      return '<![CDATA[' . str_replace(']]>', ']]]]><![CDATA[>', $string) . ']]>';
   }

यदि आवश्यक हो तो एक multibyte-safe str_replace का उपयोग करना न भूलें (गैर लैटिन $string ):

   function mb_str_replace($search, $replace, $subject, &$count = 0)
   {
      if (!is_array($subject))
      {
         $searches = is_array($search) ? array_values($search) : array ($search);
         $replacements = is_array($replace) ? array_values($replace) : array ($replace);
         $replacements = array_pad($replacements, count($searches), '');
         foreach ($searches as $key => $search)
         {
            $parts = mb_split(preg_quote($search), $subject);
            $count += count($parts) - 1;
            $subject = implode($replacements[$key], $parts);
         }
      }
      else
      {
         foreach ($subject as $key => $value)
         {
            $subject[$key] = mb_str_replace($search, $replace, $value, $count);
         }
      }
      return $subject;
   }

मैं सोच रहा था कि क्या एक सीडीएटीए एंड टोकन ( ]]> से बचने का कोई तरीका है) एक एक्सएमएल दस्तावेज़ में एक सीडीएटीए अनुभाग के भीतर। या, अधिक आम तौर पर, अगर सीडीएटीए के भीतर उपयोग करने के लिए कुछ भागने का अनुक्रम होता है (लेकिन यदि यह अस्तित्व में है, तो मुझे लगता है कि यह संभवतया केवल प्रारंभ या अंतिम टोकन से बचने के लिए समझ में आता है)।

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

शायद, आपको अपने एक्सएमएल संरचना या अपने कोड को फिर से प्रतिक्रिया देना चाहिए यदि आप खुद को ऐसा करने का प्रयास करते हैं, लेकिन भले ही मैं पिछले 3 सालों से दैनिक आधार पर एक्सएमएल के साथ काम कर रहा हूं और मुझे कभी भी यह समस्या नहीं है, मैं सोच रहा था कि यह संभव था। जिज्ञासा के कारण।

संपादित करें:

एचटीएमएल एन्कोडिंग का उपयोग करने के अलावा ...


PHP में: '<![CDATA['.implode(explode(']]>', $string), ']]]]><![CDATA[>').']]>'


आपको छुपाए जाने के लिए अपने डेटा को टुकड़ों में तोड़ना होगा ]]>

यहां पूरी बात है:

<![CDATA[]]]]><![CDATA[>]]>

पहला <![CDATA[]]]]> है ]] । दूसरा <![CDATA[>]]> है >


एक और समाधान प्रतिस्थापित करना है ]]> द्वारा ]]]><![CDATA[]>


जाहिर है, यह सवाल पूरी तरह अकादमिक है। सौभाग्य से, यह एक बहुत ही निश्चित जवाब है।

आप एक सीडीएटीए अंत अनुक्रम से बच नहीं सकते हैं। एक्सएमएल specification उत्पादन नियम 20 काफी स्पष्ट है:

[20]    CData      ::=      (Char* - (Char* ']]>' Char*))

संपादित करें: इस उत्पाद नियम का शाब्दिक अर्थ है "एक सीडीएटा अनुभाग में जो भी आप चाहते हैं वह हो सकता है लेकिन अनुक्रम ']]>' कोई अपवाद नहीं है।"।

EDIT2: एक specification भी पढ़ता है:

सीडीएटीए अनुभाग के भीतर, केवल सीडीईएनडी स्ट्रिंग को मार्कअप के रूप में पहचाना जाता है, ताकि बाएं कोण ब्रैकेट और एम्परसैंड उनके शाब्दिक रूप में हो सकें; उन्हें " &lt; " और " &amp; " का उपयोग करके बचने की आवश्यकता नहीं है (और नहीं)। सीडीएटीए अनुभाग घोंसला नहीं कर सकते हैं।

दूसरे शब्दों में, इकाई संदर्भ, मार्कअप या व्याख्या किए गए वाक्यविन्यास के किसी अन्य रूप का उपयोग करना संभव नहीं है। सीडीएटीए अनुभाग के अंदर एकमात्र पार्स किया गया पाठ ]]> , और यह खंड को समाप्त करता है।

इसलिए, बचाना संभव नहीं है ]]> एक सीडीएटीए अनुभाग के भीतर।

EDIT3: एक specification भी पढ़ता है:

2.7 सीडीएटीए अनुभाग

[परिभाषा: सीडीएटीए अनुभाग कहीं भी हो सकता है चरित्र डेटा हो सकता है; वे अक्षरों वाले पाठ के ब्लॉक से बचने के लिए उपयोग किए जाते हैं जिन्हें अन्यथा मार्कअप के रूप में पहचाना जाएगा। सीडीएटीए अनुभाग स्ट्रिंग के साथ शुरू होते हैं "<! [सीडीएटीए [" और स्ट्रिंग के साथ अंत "]]>:]

फिर एक सीडीएटीए अनुभाग हो सकता है जहां कहीं भी चरित्र डेटा हो सकता है, जिसमें एकल सीडीएटीए अनुभाग के एकाधिक आसन्न सीडीएटीए अनुभाग शामिल हैं। इससे ]]> टोकन को विभाजित करना संभव हो सकता है और इसके दो हिस्सों को आसन्न सीडीएटीए अनुभागों में रखा जा सकता है।

उदाहरण के लिए:

<![CDATA[Certain tokens like ]]> can be difficult and <invalid>]]> 

के रूप में लिखा जाना चाहिए

<![CDATA[Certain tokens like ]]]]><![CDATA[> can be difficult and <valid>]]> 

बस प्रतिस्थापित करें ]]> साथ ]]]]><![CDATA[>


यहां एक और मामला है जिसमें ]]> भागने की जरूरत है। मान लीजिए कि हमें एक XML दस्तावेज़ के सीडीएटीए ब्लॉक के अंदर एक पूरी तरह से वैध HTML दस्तावेज़ को सहेजने की आवश्यकता है और HTML स्रोत का अपना सीडीएटीए ब्लॉक होता है। उदाहरण के लिए:

<htmlSource><![CDATA[ 
    ... html ...
    <script type="text/javascript">
        /* <![CDATA[ */
        -- some working javascript --
        /* ]]> */
    </script>
    ... html ...
]]></htmlSource>

टिप्पणी की गई सीडीएटीए प्रत्यय को बदलने की जरूरत है:

        /* ]]]]><![CDATA[> *//

चूंकि एक एक्सएमएल पार्सर जावास्क्रिप्ट टिप्पणी ब्लॉक को संभालने के बारे में नहीं जानता है







cdata