2010-12-02 8 views
14

प्रश्नों का उपयोग कर यह कहते हैं सब :)Convert एचटीएमएल चरित्र संस्थाओं वापस नियमित पाठ करने के लिए जावास्क्रिप्ट

जैसे। हम > है, हम का उपयोग कर केवल जावास्क्रिप्ट

अद्यतन> की जरूरत है: ऐसा लगता है jQuery आसान तरीका बाहर है। लेकिन, हल्का समाधान होना अच्छा लगेगा। एक ऐसा फ़ंक्शन जैसा जो स्वयं ही ऐसा करने में सक्षम है।

+0

यदि आपको इसकी आवश्यकता है, तो एक निश्चित संभावना है कि आप गलत तरीके से समस्या का सामना कर रहे हैं। – AndreKR

+2

ऐसा करने के पीछे तर्क क्या है? – nuaavee

+0

यह एक ऐसे मामले में जरूरी है जहां आपके पास डेटा है जिसे प्रदर्शित करने के लिए HTML अनुकूल होना आवश्यक है लेकिन किसी उपयोगकर्ता द्वारा डाउनलोड की गई फ़ाइल फ़ाइल में सहेजा जा सकता है। उस स्थिति में, यह वास्तव में जरूरी है क्योंकि उपयोगकर्ता आमतौर पर यह भी नहीं जानते कि यह एक चरित्र इकाई है, कभी भी यह ध्यान न रखें कि यह कौन सा है। – ArtlyticalMedia

उत्तर

24

आप कुछ इस तरह कर सकता है:

String.prototype.decodeHTML = function() { 
    var map = {"gt":">" /* , … */}; 
    return this.replace(/&(#(?:x[0-9a-f]+|\d+)|[a-z]+);?/gi, function($0, $1) { 
     if ($1[0] === "#") { 
      return String.fromCharCode($1[1].toLowerCase() === "x" ? parseInt($1.substr(2), 16) : parseInt($1.substr(1), 10)); 
     } else { 
      return map.hasOwnProperty($1) ? map[$1] : $0; 
     } 
    }); 
}; 
+0

साफ समाधान। मेरे पास एक सवाल है - आप लाइन 5 पर हेक्साडेसिमल चार कोड क्यों देख रहे हैं? – nuaavee

+1

@nuaavee: क्योंकि चरित्र संदर्भ दशमलव या हेक्साडेसिमल नोटेशन में हो सकते हैं: ' ' = ' '। – Gumbo

+0

क्या यह ब्राउज़र निर्भर है? मेरा मतलब है हेक्स नोटेशन केवल कुछ ब्राउज़रों पर लागू होते हैं? – nuaavee

0

इसमें कुछ भी नहीं बनाया गया है, लेकिन ऐसा करने के लिए कई पुस्तकालयों को लिखा गया है।

Here एक है।

और here एक जो jQuery प्लगइन है।

19
function decodeEntities(s){ 
    var str, temp= document.createElement('p'); 
    temp.innerHTML= s; 
    str= temp.textContent || temp.innerText; 
    temp=null; 
    return str; 
} 

alert(decodeEntities('<')) 

/* returned value: (String) 
< 
*/ 
+2

अविश्वसनीय (उपयोगकर्ता द्वारा दर्ज) पाठ पर उपयोग करना सुरक्षित नहीं है। यह टिप्पणी देखें http://stackoverflow.com/questions/1147359/how-to-decode-html-entities-using-jquery#comment6018122_2419664 – nickf

1

मुझे पता है कि पुस्तकालयों सारे हैं, लेकिन यहाँ ब्राउज़र के लिए समाधान के एक जोड़े हैं। एचटीएमएल इकाई डेटा स्ट्रिंग्स को मानवीय संपादन योग्य क्षेत्रों में रखकर अच्छी तरह से काम करते हैं जहां आप अक्षर दिखाना चाहते हैं, जैसे टेक्स्टरेरा या इनपुट [टाइप = टेक्स्ट]।

मैं यह उत्तर जोड़ता हूं क्योंकि मुझे आईई के पुराने संस्करणों का समर्थन करना है और मुझे लगता है कि यह कुछ दिनों के शोध और परीक्षण के लिए तैयार है। मुझे आशा है कि किसी को यह उपयोगी लगेगा।

सबसे पहले यह jQuery का उपयोग करके अधिक आधुनिक ब्राउज़र के लिए है, कृपया ध्यान दें कि यदि आपको 10 (7, 8, या 9) से पहले IE के संस्करणों का समर्थन करना है, तो इसका उपयोग नहीं किया जाना चाहिए क्योंकि यह आपको छोड़ने वाली न्यूलाइन को बाहर कर देगा पाठ की सिर्फ एक लंबी लाइन।

if (!String.prototype.HTMLDecode) { 
    String.prototype.HTMLDecode = function() { 
      var str = this.toString(), 
      $decoderEl = $('<textarea />'); 

     str = $decoderEl.html(str) 
      .text() 
      .replace(/<br((\/)|(\/))?>/gi, "\r\n"); 

     $decoderEl.remove(); 

     return str; 
    }; 
} 

यह अगले एक कुछ मतभेद जो ज्यादातर पुराने आईई संस्करण के लिए कर रहे हैं के साथ ऊपर Kennebec के काम पर आधारित है,। इसे jQuery की आवश्यकता नहीं है, लेकिन अभी भी एक ब्राउज़र की आवश्यकता है।

if (!String.prototype.HTMLDecode) { 
    String.prototype.HTMLDecode = function() { 
     var str = this.toString(), 
      //Create an element for decoding    
      decoderEl = document.createElement('p'); 

     //Bail if empty, otherwise IE7 will return undefined when 
     //OR-ing the 2 empty strings from innerText and textContent 
     if (str.length == 0) { 
      return str; 
     } 

     //convert newlines to <br's> to save them 
     str = str.replace(/((\r\n)|(\r)|(\n))/gi, " <br/>");    

     decoderEl.innerHTML = str; 
     /* 
     We use innerText first as IE strips newlines out with textContent. 
     There is said to be a performance hit for this, but sometimes 
     correctness of data (keeping newlines) must take precedence. 
     */ 
     str = decoderEl.innerText || decoderEl.textContent; 

     //clean up the decoding element 
     decoderEl = null; 

     //replace back in the newlines 
     return str.replace(/<br((\/)|(\/))?>/gi, "\r\n"); 
    }; 
} 

/* 
Usage: 
    var str = "&gt;"; 
    return str.HTMLDecode(); 

returned value: 
    (String) >  
*/ 
2

संपूर्ण HTML दस्तावेज़ को डीकोड करने के लिए यहां एक "कक्षा" है।

HTMLDecoder = { 
    tempElement: document.createElement('span'), 
    decode: function(html) { 
     var _self = this; 
     html.replace(/&(#(?:x[0-9a-f]+|\d+)|[a-z]+);/gi, 
      function(str) { 
       _self.tempElement.innerHTML= str; 
       str = _self.tempElement.textContent || _self.tempElement.innerText; 
       return str; 
      } 
     ); 
    } 
} 

ध्यान दें कि मैं संस्थाओं को पकड़ने के लिए है, लेकिन पूरी तरह से वैध HTML दस्तावेज़ (या एक्सएचटीएमएल) के लिए Gumbo के regexp इस्तेमाल किया आप simpy /&[^;]+;/g इस्तेमाल कर सकते हैं।

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