2010-12-02 11 views
14

を使用してHTML文字エンティティを通常のテキストに変換してください。javacript

例:我々は、我々はJavaScriptのみ

更新を使用して>を必要とし、>持っている: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

ニートの解決策。私は1つの質問があります - どうしてライン5の16進数のcharコードをチェックしていますか? – nuaavee

+1

@nuaavee:文字参照は10進表記または16進表記であるため、「 」=「 」となります。 – Gumbo

+0

このブラウザは依存していますか?つまり、16進表記は特定のブラウザにのみ適用されますか? – nuaavee

0

何も組み込まれていませんが、これを行うために書かれたライブラリがたくさんあります。

Hereは1です。

そして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

私は図書館がそこにある知っているが、ここでは、ブラウザのためのソリューションのカップルです。これらは、HTMLエンティティのデータ文字列を、テキストエリアや入力[type = text]など、文字を表示する人間が編集可能な領域に配置するときに有効です。

私は古いバージョンのIEをサポートしなければならないので、この回答を追加します。私は数日間の研究とテストを終わらせると感じています。私は誰かがこれが有用であることを願っています。

これはjQueryを使用している最新のブラウザです.10(7,8,9)より前のバージョンのIEをサポートする必要がある場合は、これを使用しないでください。 1つの長いテキスト行。

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の作業に基づいていますが、これは主に古いIEバージョンのためのものです。これは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ドキュメント全体をデコードする「クラス」があります。私はあなたがあるSimpy /&[^;]+;/gを使用することができますエンティティを引くためではなく、完全に有効なHTML文書(またはXHTML)のためガンボの正規表現を使用

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; 
      } 
     ); 
    } 
} 

注意。