अंतर्निहित HTML संस्थाओं (यानी & quot; या & # 39;) को डिकोड करने का तरीका


11

मैं हाल ही में HTML संस्थाओं को डिकोड करने की समस्या में भाग गया। मेरे पास निम्नलिखित दो तार हैं ( ध्यान दें कि एन्कोडिंग के दो तरीकों का उपयोग कैसे किया जाता है, नाम और क्रमांकित )।

The old "how to fold xml" question
Babel doesn't wrap results in verbatim

और मुझे उन्हें बदलने की जरूरत है

The old "how to fold xml" question
Babel doesn't wrap results in verbatim

आसपास खोज करने पर, मुझे एसओ पर यह पुराना सवाल मिला (जो कि मैं इस समय क्या कर रहा हूं), लेकिन मैं यह मानने से इनकार करता हूं कि एमएसीएस के पास ऐसा करने का कोई अंतर्निहित तरीका नहीं है। हमारे पास कई वेब ब्राउज़र हैं, जिनमें से कम से कम दो मुझे पता है कि बिल्ट-इन हैं, मेल क्लाइंट्स का उल्लेख करने और पाठकों को खिलाने के लिए नहीं।

क्या html संस्थाओं को डिकोड करने का एक अंतर्निहित तरीका नहीं है?
मैं एक ऐसे फंक्शन की तलाश में हूं जो पहले उदाहरण से एक स्ट्रिंग लेता है और दूसरे उदाहरण से एक स्ट्रिंग लौटाता है।


अगर कुछ है, तो मुझे यकीन है कि यह nxml कोड में होना चाहिए क्योंकि यह DTDs को पार्स करने में सक्षम है और दस्तावेज़ में संस्थाओं को मान्य कर सकता है।
वामासा

libxml-parse-html-regionयह, निश्चित रूप से, लेकिन यह आप जितना चाहते हैं उससे अधिक कर सकते हैं, इसमें HTML टैग्स को भी पार्स करता है ... (और सभी Emacs को LibXML समर्थन के साथ नहीं बनाया गया है, मुझे लगता है)।
जॉन ओ।

जवाबों:


7

Emacs में एक शुद्ध-एलिसिप XML पार्सर शामिल होता है xml.el, जिसका xml-parse-stringकार्य कार्य करता है, हालांकि यह एक अनिर्दिष्ट आंतरिक फ़ंक्शन जैसा लगता है। मुझे यकीन नहीं है कि अगर कोई HTML- केवल इकाइयां हैं जो स्ट्रिंग को XML टुकड़ा के रूप में मानकर ठीक से नियंत्रित नहीं किया जाएगा।

यह आवरण फ़ंक्शन इनपुट स्ट्रिंग से किसी भी अनुगामी टैग को छोड़ देगा, हालांकि आप इसे कठोर बना सकते हैं:

(defun decode-entities (html)
  (with-temp-buffer
    (save-excursion (insert html))
    (xml-parse-string)))

(decode-entities "The old "how to fold xml" question")
;; => "The old \"how to fold xml\" question"

(decode-entities "doesn't")
;; => "doesn't"

(decode-entities "string with trailing tag: <tag/>")
;; => "string with trailing tag: "

LibXML समर्थन के साथ Emacs में, एक और हैकिश तरीका एक आवरण के चारों ओर लिखना होगा libxml-html-parse-region। चूंकि LibXML पार्सर मानता है कि इसका तर्क एक पूर्ण HTML दस्तावेज़ है, रैपर फ़ंक्शन का उपयोग करके लौटाए गए दस्तावेज़ संरचना से पार्स किए गए वर्ण डेटा को निकालना है pcase। एक स्ट्रिंग को डिकोड करने की कोशिश करना जिसमें कोई भी HTML टैग हो वह एक त्रुटि उत्पन्न करेगा:

(defun decode-entities/libxml (html)
  (with-temp-buffer
    (insert html)
    (let ((document
           (libxml-parse-html-region (point-min) (point-max))))
      (pcase document
        (`(html nil
                (body nil
                      (p nil
                         ,(and (pred stringp)
                               content))))
          content)
        (_ (error "Unexpected parse result: %S" document))))))

परिणाम:

(decode-entities/libxml "The old &quot;how to fold xml&quot; question")
     ; => "The old \"how to fold xml\" question"
(decode-entities/libxml "doesn&#39;t") ; => "doesn't"

(decode-entities/libxml "<html>")              ; produces an error

एक दस्तावेज़ के टुकड़े को एक पूर्ण दस्तावेज़ के रूप में पार्स करके, केवल आसपास के टैग से तुरंत छीनने के लिए यह थोड़ा पिछड़ा हुआ लगता है। दूसरी ओर, LibXML का उपयोग तेजी से होना चाहिए और सटीक परिणाम देना चाहिए।


क्षमा करें, मैंने आपका xml संपादन नहीं देखा था। कमाल का दिखता है।
मालाबार

धन्यवाद - मैंने xml.elपहले सरल समाधान डालने का उत्तर संपादित किया ।
जॉन ओ।

@ मलबार्बा नोट जिसमें lisp/xml.elहमेशा फ़ंक्शन शामिल होता है xml-substitute-special, जो जॉन ओ केdecode-entities रूप में एक ही इकाई डिकोडिंग करता है । यह, हालांकि, अनुगामी टैग को छोड़ना नहीं है।
तुलसी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.