テキストJavaScriptからHTMLを取り除く


回答:


761

ブラウザで実行している場合、最も簡単な方法は、ブラウザに実行させるだけです...

function stripHtml(html)
{
   var tmp = document.createElement("DIV");
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

注:コメントで述べたように、HTMLのソースを制御しない場合(たとえば、ユーザー入力から取得した可能性のあるものに対してこれを実行しないこと)は、これを回避するのが最善です。これらのシナリオでは、次のことができ、まだブラウザがあなたのために仕事をさせ- 現在広く利用可能DOMParserにを使用してのサバの回答を参照してください


40
このアプローチは一貫性がなく、特定のブラウザで特定の文字を削除できないことに注意してください。例えば、prototype.jsの中で、我々はパフォーマンスのために、このアプローチを使用しますが、欠点のいくつかの回避策- github.com/kangax/prototype/blob/...
kangax

11
空白がめちゃくちゃになることを覚えておいてください。以前はこの方法を使用していましたが、特定の製品コードにダブルスペースが含まれていて、DIVからinnerTextを取得するとシングルスペースになったため、問題が発生しました。その後、製品コードがアプリケーションの後半で一致しませんでした。
マグナススミス

11
@マグナス・スミス:はい、空白が問題になる場合-または実際に、作業している特定のHTML DOMに直接関係しないこのテキストが必要な場合-他の1つを使用する方がよいここに与えられた解決策。この方法の主な利点は、1)簡単であり、2)で実行しているブラウザと同じ方法タグ、空白、エンティティ、コメントなどを確実に処理できることです。これは、Webクライアントのコードにはしばしば役立ちますが、ルールが異なる他のシステムとのやり取りには必ずしも適切ではありません。
Shog9 2009

220
信頼できないソースからのHTMLでこれを使用しないでください。理由を確認するには、実行してみてくださいstrip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
マイクサミュエル

24
htmlに画像(imgタグ)が含まれている場合、画像はブラウザによってリクエストされます。それは良いことではありません。
douyw 2013

591
myString.replace(/<[^>]*>?/gm, '');

4
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)" 介して注入する場合、document.writeまたはを介して注入する>前にを含む文字列と連結する場合は機能しませんinnerHTML
マイクサミュエル

1
@PerishableDave、私>は秒で残されることに同意します。しかし、それは注射の危険ではありません。ハザード<は最初の1つに残っているために発生し、2番目の開始時にHTMLパーサーがデータ状態以外のコンテキストになる原因となります。のデータ状態からの遷移がないことに注意してください>
マイクサミュエル

73
@MikeSamuelこの答えはもう決めましたか?単純なユーザーがここにコピーして貼り付ける準備ができています。
Ziggy

1
これも、<button onClick="dostuff('>');"></button>HTMLが正しく記述されていると仮定すると、完全に混乱しますが、属性の引用テキストのどこかに大なり記号が含まれている可能性があることを考慮する必要があります。また<script>、少なくともタグ内のすべてのテキストを削除する必要があります。
Jonathon 2013

15
@AntonioMaxは、私はこの質問に答えてきましたうんざりしているため、しかし、あなたの質問の物質に対するセキュリティクリティカルなコードをコピー&ペーストするべきではありません。 ライブラリをダウンロードし、最新のパッチを適用して、最近発見された脆弱性やブラウザの変更から保護する必要があります。
マイクサミュエル

249

最も簡単な方法:

jQuery(html).text();

これは、htmlの文字列からすべてのテキストを取得します。


111
私たちのプロジェクトには常に多くのJavascriptがあるため、プロジェクトには常にjQueryを使用します。したがって、バルクを追加せず、既存のAPIコードを利用しました...
Mark

32
使用しますが、OPは使用しない場合があります。問題は、Javascript NOT JQueryに関するものでした。
認知症

105
OPと同じことをする必要がある人(私のような)にとってもjQueryの使用を気にしない人にとっては、これは依然として有用な回答です。言うまでもなく、使用を検討している場合、OPにとっても有用である可能性があります。 jQuery。サイトのポイントは知識を共有することです。正当な理由なしに有用な回答を非難することによってもたらされる恐ろしい影響に留意してください。
acjay 2012年

27
@Dementicは驚いたことに、複数の回答を含むスレッドが最も有用であると感じています。これは、多くの場合、二次回答が私の正確なニーズを満たし、一次回答が一般的なケースを満たしているためです。
Eric Goldberg

36
文字列の一部がhtmlタグでラップされていない場合、これは機能しません。例:「<b>エラー:</ b>有効なメールアドレスを入力してください」は「エラー:」のみを返します
Aamir Afridi

127

Shog9の承認済み回答の編集バージョンを共有したいと思います


マイク・サムエルがコメントで指摘し、その関数は、インラインのJavaScriptコードを実行することができます。
しかし、「ブラウザに任せて...」と言ったとき、Shog9は正しいです。

そう.. DOMParserを使った私の編集したバージョン:

function strip(html){
   var doc = new DOMParser().parseFromString(html, 'text/html');
   return doc.body.textContent || "";
}

ここでインラインJavaScriptをテストするコード:

strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")

また、(画像のように)解析時にリソースを要求しません

strip("Just text <img src='https://assets.rbl.ms/4155638/980x.jpg'>")

3
このソリューションはブラウザでのみ機能することを付け加えておきます。
kris_IV 2018

1
これはストリップタグではなく、PHP htmlspecialchars()に似ています。まだ私にとっては便利です。
Daantje、2018

これにより、テキストの先頭から空白も削除されることに注意してください。
Raine Revere

また、これはWebワーカーでも機能します
Chris Seufert

これは@ Shog9の答えよりもはるかに速いようです
Shmuel

55

jQueryメソッドの拡張として、文字列にHTMLが含まれていない場合(フォームフィールドからHTMLを削除しようとしている場合など)

jQuery(html).text();`

HTMLがない場合は空の文字列を返します

使用する:

jQuery('<p>' + html + '</p>').text();

代わりに。

更新: コメントで指摘されているように、状況によっては、このソリューションは、攻撃者の影響を受ける可能性があるhtml場合に含まれるJavaScriptを実行しhtmlます。別のソリューションを使用してください。


12
または$("<p>").html(html).text();
Dimitar Dimitrov

4
これはおそらく危険なコードを実行しますjQuery('<span>Text :) <img src="a" onerror="alert(1)"></span>').text()
Simon

jQuery( "aa&#X003c; script> alert(1)&#X003c; / script> a")。text();を試してください
Grzegorz Kaczan 2017

41

ハイパーリンク(a href)をそのままにして、プレーンテキストの電子メール送信用にHTMLを変換する

hypoxideによって投稿された上記の関数は正常に機能しますが、基本的にはWebリッチテキストエディター(FCKEditorなど)で作成されたHTMLを変換し、すべてのHTMLをクリアしますが、HTMLとプレーンテキストバージョンは、STMP電子メール(HTMLとプレーンテキストの両方)の正しい部分の作成に役立ちます。

長い間Googleを検索していた後、私と同僚はJavascriptの正規表現エンジンを使用してこれを思いつきました。

str='this string has <i>html</i> code i want to <b>remove</b><br>Link Number 1 -><a href="http://www.bbc.co.uk">BBC</a> Link Number 1<br><p>Now back to normal text and stuff</p>
';
str=str.replace(/<br>/gi, "\n");
str=str.replace(/<p.*>/gi, "\n");
str=str.replace(/<a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 (Link->$1) ");
str=str.replace(/<(?:.|\s)*?>/g, "");

str変数は次のように出て起動します:

this string has <i>html</i> code i want to <b>remove</b><br>Link Number 1 -><a href="http://www.bbc.co.uk">BBC</a> Link Number 1<br><p>Now back to normal text and stuff</p>

コードが実行された後、次のようになります:-

this string has html code i want to remove
Link Number 1 -> BBC (Link->http://www.bbc.co.uk)  Link Number 1


Now back to normal text and stuff

ご覧のとおり、すべてのHTMLが削除されており、リンクは維持されており、ハイパーリンクされたテキストはそのまま残っています。また、<p><br>タグを\n(改行文字)に置き換えて、ある種の視覚的なフォーマットが保持されるようにしました。

リンクの形式(例:)を変更BBC (Link->http://www.bbc.co.uk)するには$2 (Link->$1)、を編集します。$1は、href URL / URIであり、$2はハイパーリンクされたテキストです。プレーンテキストの本文に直接リンクがあるため、ほとんどのSMTPメールクライアントはこれらを変換するので、ユーザーはリンクをクリックできます。

これがお役に立てば幸いです。


「&nbsp;」を処理しません
Rose Nettoyeur 2018年

33

受け入れられた回答の改善。

function strip(html)
{
   var tmp = document.implementation.createHTMLDocument("New").body;
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

このように、このように実行されているものは害を及ぼしません:

strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")

Firefox、Chromium、およびExplorer 9以降は安全です。Opera Prestoはまだ脆弱です。また、文字列で言及されている画像は、ChromiumおよびFirefoxのhttpリクエストの保存ではダウンロードされません。


これはある方法ですが、安全ではありません<script><script>alert();
Arth

1
ここでは、LinuxのChromium / Opera / Firefoxでスクリプトを実行しないので、なぜ安全ではないのですか?
Janghou

私の謝罪、私はミステストをしている必要があります、おそらくjsFiddleでもう一度実行をクリックするのを忘れていました。
Arth 2016

「新しい」議論は不必要だと思いますか?
Jon Schneider

仕様によると、現在はオプションですが、常にそうであるとは限りませんでした。
Janghou 16

23

これは、Javascript環境(NodeJSを含む)で機能します。

const text = `
<html lang="en">
  <head>
    <style type="text/css">*{color:red}</style>
    <script>alert('hello')</script>
  </head>
  <body><b>This is some text</b><br/><body>
</html>`;

// Remove style tags and content
text.replace(/<style[^>]*>.*<\/style>/gm, '')
    // Remove script tags and content
    .replace(/<script[^>]*>.*<\/script>/gm, '')
    // Remove all opening, closing and orphan HTML tags
    .replace(/<[^>]+>/gm, '')
    // Remove leading spaces and repeated CR/LF
    .replace(/([\r\n]+ +)+/gm, '');

@pstantonは、ステートメントの実用的な例を教えていただけますか?
Karl.S

3
<html><style..>* {font-family:comic-sans;}</style>Some Text</html>
スタントン2018

@pstantonコードを修正し、コメントを追加しました。応答が遅いため申し訳ありません。
Karl.S、

16

Jibberboy2000の回答を変更して、いくつかの<BR />タグ形式を含め、内部<SCRIPT><STYLE>タグをすべて削除し、複数の改行とスペースを削除して結果のHTMLをフォーマットし、HTMLエンコードされたコードを通常に変換しました。いくつかのテストの後、ほとんどの完全なWebページを、ページタイトルとコンテンツが保持される単純なテキストに変換できるようです。

簡単な例では、

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<!--comment-->

<head>

<title>This is my title</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>

    body {margin-top: 15px;}
    a { color: #D80C1F; font-weight:bold; text-decoration:none; }

</style>
</head>

<body>
    <center>
        This string has <i>html</i> code i want to <b>remove</b><br>
        In this line <a href="http://www.bbc.co.uk">BBC</a> with link is mentioned.<br/>Now back to &quot;normal text&quot; and stuff using &lt;html encoding&gt;                 
    </center>
</body>
</html>

なる

これが私のタイトルです

この文字列には削除したいHTMLコードがあります

この行では、リンク付きのBBC(http://www.bbc.co.uk)が言及されています。

「通常のテキスト」に戻って、

JavaScript関数とテストページは次のようになります。

function convertHtmlToText() {
    var inputText = document.getElementById("input").value;
    var returnText = "" + inputText;

    //-- remove BR tags and replace them with line break
    returnText=returnText.replace(/<br>/gi, "\n");
    returnText=returnText.replace(/<br\s\/>/gi, "\n");
    returnText=returnText.replace(/<br\/>/gi, "\n");

    //-- remove P and A tags but preserve what's inside of them
    returnText=returnText.replace(/<p.*>/gi, "\n");
    returnText=returnText.replace(/<a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 ($1)");

    //-- remove all inside SCRIPT and STYLE tags
    returnText=returnText.replace(/<script.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/script>/gi, "");
    returnText=returnText.replace(/<style.*>[\w\W]{1,}(.*?)[\w\W]{1,}<\/style>/gi, "");
    //-- remove all else
    returnText=returnText.replace(/<(?:.|\s)*?>/g, "");

    //-- get rid of more than 2 multiple line breaks:
    returnText=returnText.replace(/(?:(?:\r\n|\r|\n)\s*){2,}/gim, "\n\n");

    //-- get rid of more than 2 spaces:
    returnText = returnText.replace(/ +(?= )/g,'');

    //-- get rid of html-encoded characters:
    returnText=returnText.replace(/&nbsp;/gi," ");
    returnText=returnText.replace(/&amp;/gi,"&");
    returnText=returnText.replace(/&quot;/gi,'"');
    returnText=returnText.replace(/&lt;/gi,'<');
    returnText=returnText.replace(/&gt;/gi,'>');

    //-- return
    document.getElementById("output").value = returnText;
}

次のHTMLで使用されました:

<textarea id="input" style="width: 400px; height: 300px;"></textarea><br />
<button onclick="convertHtmlToText()">CONVERT</button><br />
<textarea id="output" style="width: 400px; height: 300px;"></textarea><br />

1
私はこのソリューションが好きです。html特殊文字が処理されるからです...しかし、まだ十分ではありません...私にとっての最善の答えは、それらすべてを処理することです。(これはおそらくjqueryが行うことです)。
Daniel Gerson、

2
ある/<p.*>/giべきだと思います/<p.*?>/gi
cbron

すべての<br>タグを削除するには、代わりに適切な正規表現を使用できます。/<br\s*\/?>/そのため、3の代わりに1つだけ置換できます。また、エンティティのデコードを除いて、次のような単一の正規表現を使用できるようです/<[a-z].*?\/?>/
Alexis Wilke

素晴らしいスクリプトです。しかし、テーブルのコンテンツはどうですか?どのように表示できるか
Hristo Enev 2017

@DanielGerson、エンコーディングhtmlは本当に毛深い、非常に速くなります
KyleMit

15
var text = html.replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g, "");

これは正規表現バージョンであり、次のような不正なHTMLに対してより耐性があります。

閉じられていないタグ

Some text <img

タグ属性内の「<」、「>」

Some text <img alt="x > y">

改行

Some <a href="http://google.com">

コード

var html = '<br>This <img alt="a>b" \r\n src="a_b.gif" />is > \nmy<>< > <a>"text"</a'
var text = html.replace(/<\/?("[^"]*"|'[^']*'|[^>])*(>|$)/g, "");

7

nickfやShog9のソリューションよりも明らかにエレガントでないソリューションとして、もう1つは、DOMを再帰的に<body>タグから始め、各テキストノードを追加することです。

var bodyContent = document.getElementsByTagName('body')[0];
var result = appendTextNodes(bodyContent);

function appendTextNodes(element) {
    var text = '';

    // Loop through the childNodes of the passed in element
    for (var i = 0, len = element.childNodes.length; i < len; i++) {
        // Get a reference to the current child
        var node = element.childNodes[i];
        // Append the node's value if it's a text node
        if (node.nodeType == 3) {
            text += node.nodeValue;
        }
        // Recurse through the node's children, if there are any
        if (node.childNodes.length > 0) {
            appendTextNodes(node);
        }
    }
    // Return the final result
    return text;
}

3
うわぁ。文字列からDOMツリーを作成する場合は、shogの方法を使用してください。
nickf 2009年

はい、私の解決策は、通常のハンマーがより適切なスレッジハンマーを備えています:-)。そして、私はあなたとShog9のソリューションの方が優れていることに同意し、基本的に答えの中で同じように述べました。私はまた、htmlが既に文字列に含まれているという私の返答に反映できず、とにかく私の質問は元の質問に関して本質的に役に立たなくなりました。:-(
ブライアン

1
公平に言うと、これには価値があります。テキストの/ all /を絶対に保持する必要がある場合、改行、タブ、キャリッジリターンなどをキャプチャするのに少なくともまともなショットがあります。 、そしてはるかに速く行う...ええ。
Shog9 2009

7

リンクとコンテンツの構造(h1、h2など)を保持する場合は、TextVersionJSを確認してください。。HTMLメールはプレーンテキストに変換するために作成されていますが、任意のHTMLで使用できます。

使い方はとても簡単です。たとえば、node.jsの場合:

var createTextVersion = require("textversionjs");
var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";

var textVersion = createTextVersion(yourHtml);

または、純粋なjsを使用したブラウザで:

<script src="textversion.js"></script>
<script>
  var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
  var textVersion = createTextVersion(yourHtml);
</script>

require.jsでも動作します:

define(["textversionjs"], function(createTextVersion) {
  var yourHtml = "<h1>Your HTML</h1><ul><li>goes</li><li>here.</li></ul>";
  var textVersion = createTextVersion(yourHtml);
});

4

すべてではないにしても、最も言及されたすべての回答を試した後、それらのすべてがエッジケースであり、私のニーズを完全にサポートすることができませんでした。

私はphpがどのようにそれを実行するのかを調査し始め、ここでstrip_tagsメソッドを複製するphp.js libに出会いました:http ://phpjs.org/functions/strip_tags/


これはきちんとした機能であり、十分に文書化されています。ただし、allowed == ''OPが要求したものであると考えるときは、より速くすることができます。これは、バイロンが以下で答えたものとほぼ同じです(バイロンは[^>]間違っているだけです)
Alexis Wilke

1
allowedparam を使用する場合、XSSに対して脆弱です: stripTags('<p onclick="alert(1)">mytext</p>', '<p>')戻り値<p onclick="alert(1)">mytext</p>
Chris Cinelli、2016

4
function stripHTML(my_string){
    var charArr   = my_string.split(''),
        resultArr = [],
        htmlZone  = 0,
        quoteZone = 0;
    for( x=0; x < charArr.length; x++ ){
     switch( charArr[x] + htmlZone + quoteZone ){
       case "<00" : htmlZone  = 1;break;
       case ">10" : htmlZone  = 0;resultArr.push(' ');break;
       case '"10' : quoteZone = 1;break;
       case "'10" : quoteZone = 2;break;
       case '"11' : 
       case "'12" : quoteZone = 0;break;
       default    : if(!htmlZone){ resultArr.push(charArr[x]); }
     }
    }
    return resultArr.join('');
}

>内部属性および<img onerror="javascript">新しく作成されたdom要素を考慮します。

使用法:

clean_string = stripHTML("string with <html> in it")

デモ:

https://jsfiddle.net/gaby_de_wilde/pqayphzd/

ひどいことをするトップアンサーのデモ:

https://jsfiddle.net/gaby_de_wilde/6f0jymL6/1/


属性値の内部でもエスケープされた引用符を処理する必要があります(例:)string with <a malicious="attribute \">this text should be removed, but is not">example</a>
ローガンピックアップ、2017年

4

多くの人がすでにこれに答えていますが、HTMLタグを文字列から取り除き、取り除きたくないタグの配列を含めることができるように私が書いた関数を共有すると役立つと思いました。それはかなり短く、私にとってはうまく機能しています。

function removeTags(string, array){
  return array ? string.split("<").filter(function(val){ return f(array, val); }).map(function(val){ return f(array, val); }).join("") : string.split("<").map(function(d){ return d.split(">").pop(); }).join("");
  function f(array, value){
    return array.map(function(d){ return value.includes(d + ">"); }).indexOf(true) != -1 ? "<" + value : value.split(">")[1];
  }
}

var x = "<span><i>Hello</i> <b>world</b>!</span>";
console.log(removeTags(x)); // Hello world!
console.log(removeTags(x, ["span", "i"])); // <span><i>Hello</i> world!</span>

3

上で述べたように、正規表現を使用するのが最も簡単な方法だと思います。それらの束を使用する理由はありませんが。試してください:

stringWithHTML = stringWithHTML.replace(/<\/?[a-z][a-z0-9]*[^<>]*>/ig, "");

11
セキュリティを気にする場合は、これを行わないでください。ユーザー入力がこれである場合: '<scr <script> ipt> alert(42); </ scr </ script> ipt>'ストリップされたバージョンはこれです: '<script> alert(42); </ script > '。したがって、これはXSSの脆弱性です。
molnarg 2013年

有効なタグに文字を含めることができないため、[^<>]with を変更する必要[^>]があります<。そうすると、XSSの脆弱性がなくなります。
Alexis Wilke

3

オリジナルのJibberboy2000スクリプトにいくつかの変更を加えました。誰かに役立つことを願っています

str = '**ANY HTML CONTENT HERE**';

str=str.replace(/<\s*br\/*>/gi, "\n");
str=str.replace(/<\s*a.*href="(.*?)".*>(.*?)<\/a>/gi, " $2 (Link->$1) ");
str=str.replace(/<\s*\/*.+?>/ig, "\n");
str=str.replace(/ {2,}/gi, " ");
str=str.replace(/\n+\s*/gi, "\n\n");

3

以下は、@ MikeSamuelのセキュリティ上の懸念に対処するバージョンです。

function strip(html)
{
   try {
       var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
       doc.documentElement.innerHTML = html;
       return doc.documentElement.textContent||doc.documentElement.innerText;
   } catch(e) {
       return "";
   }
}

HTMLマークアップが有効なXMLでない場合は空の文字列を返します(別名、タグを閉じ、属性を引用符で囲む必要があります)。これは理想的ではありませんが、セキュリティを悪用する可能性の問題を回避できます。

有効なXMLマークアップがないことが要件である場合は、以下を使用してみてください。

var doc = document.implementation.createHTMLDocument("");

しかし、それは他の理由でも完璧な解決策ではありません。


テキストがユーザー入力(textareaまたはcontenteditableウィジェット...)からのものである場合、これは多くの状況で失敗します
Alexis Wilke

3

iframeサンドボックス属性を使用して、htmlタグを安全に削除できます

ここでの考え方は、文字列を正規表現しようとする代わりに、DOM要素にテキストを挿入してその要素のtextContent/ innerTextプロパティをクエリすることにより、ブラウザーのネイティブパーサーを利用するというものです。

テキストを挿入するのに最適な要素は、サンドボックス化されたiframeです。これにより、任意のコードの実行を防ぐことができます(別名XSS)。

このアプローチの欠点は、ブラウザでのみ機能することです。

これが私が思いついたものです(戦闘テストされていません):

const stripHtmlTags = (() => {
  const sandbox = document.createElement("iframe");
  sandbox.sandbox = "allow-same-origin"; // <--- This is the key
  sandbox.style.setProperty("display", "none", "important");

  // Inject the sanbox in the current document
  document.body.appendChild(sandbox);

  // Get the sandbox's context
  const sanboxContext = sandbox.contentWindow.document;

  return (untrustedString) => {
    if (typeof untrustedString !== "string") return ""; 

    // Write the untrusted string in the iframe's body
    sanboxContext.open();
    sanboxContext.write(untrustedString);
    sanboxContext.close();

    // Get the string without html
    return sanboxContext.body.textContent || sanboxContext.body.innerText || "";
  };
})();

使用法(デモ):

console.log(stripHtmlTags(`<img onerror='alert("could run arbitrary JS here")' src='bogus'>XSS injection :)`));
console.log(stripHtmlTags(`<script>alert("awdawd");</` + `script>Script tag injection :)`));
console.log(stripHtmlTags(`<strong>I am bold text</strong>`));
console.log(stripHtmlTags(`<html>I'm a HTML tag</html>`));
console.log(stripHtmlTags(`<body>I'm a body tag</body>`));
console.log(stripHtmlTags(`<head>I'm a head tag</head>`));
console.log(stripHtmlTags(null));

Webベースの環境に最適なソリューション!ECMAScript 2015以降、ブロックスコープの変数は、letand const演算子を使用して適切にスコープがブロックされているため、おそらくIIFEを使用しないでください。また、あなたの解決策を使用して、私はiframesドキュメント内で使用されていないというたくさんの参照を得ました。document.body.removeChild(sandbox)将来のコピーパスタベースのリーダーのためにコードにを追加することを検討してください。
アミンNAIRI

2

jQueryでは、次のようにして簡単に取得できます。

$('#elementID').text()

2

以下のコードを使用すると、一部のhtmlタグを保持しながら、他のすべてのタグを削除できます

function strip_tags(input, allowed) {

  allowed = (((allowed || '') + '')
    .toLowerCase()
    .match(/<[a-z][a-z0-9]*>/g) || [])
    .join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>)

  var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
      commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;

  return input.replace(commentsAndPhpTags, '')
      .replace(tags, function($0, $1) {
          return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
      });
}

1
ソース(phpjs)を引用する必要があります。allowedparam を使用する場合、XSSに対して脆弱です: stripTags('<p onclick="alert(1)">mytext</p>', '<p>')戻り値<p onclick="alert(1)">mytext</p>
Chris Cinelli、2016

2

また、素晴らしいhtmlparser2の純粋なJS HTMLパーサーを使用することもできます。これは実際のデモです:

var htmlparser = require('htmlparser2');

var body = '<p><div>This is </div>a <span>simple </span> <img src="test"></img>example.</p>';

var result = [];

var parser = new htmlparser.Parser({
    ontext: function(text){
        result.push(text);
    }
}, {decodeEntities: true});

parser.write(body);
parser.end();

result.join('');

出力は This is a simple example.

ここで実際にそれを見てください:https : //tonicdev.com/jfahrenkrug/extract-text-from-html

これは、webpackなどのツールを使用してWebアプリケーションをパックした場合、ノードとブラウザの両方で機能します。


2

<a>タグを取り除き、リンクのテキストで置き換える必要がありました。

これはうまくいくようです。

htmlContent= htmlContent.replace(/<a.*href="(.*?)">/g, '');
htmlContent= htmlContent.replace(/<\/a>/g, '');

これはタグにのみ適用され、幅広い機能であるために微調整が必​​要です。
m3nda 2016年

うん、それに加えてアンカータグはのような他の多くの属性を持つことができますtitle="..."
Alexis Wilke


1

私は自分で正規表現を作成しました:

str=str.replace(/(<\?[a-z]*(\s[^>]*)?\?(>|$)|<!\[[a-z]*\[|\]\]>|<!DOCTYPE[^>]*?(>|$)|<!--[\s\S]*?(-->|$)|<[a-z?!\/]([a-z0-9_:.])*(\s[^>]*)?(>|$))/gi, ''); 

1

htmlを取り除く単純な2行のjquery。

 var content = "<p>checking the html source&nbsp;</p><p>&nbsp;
  </p><p>with&nbsp;</p><p>all</p><p>the html&nbsp;</p><p>content</p>";

 var text = $(content).text();//It gets you the plain text
 console.log(text);//check the data in your console

 cj("#text_area_id").val(text);//set your content to text area using text_area_id

1

受け入れられた回答はほとんど問題なく機能しますが、IEではhtml文字列が( ''の代わりに)nullを取得した場合です"null"。修繕:

function strip(html)
{
   if (html == null) return "";
   var tmp = document.createElement("DIV");
   tmp.innerHTML = html;
   return tmp.textContent || tmp.innerText || "";
}

1

Jqueryを使用:

function stripTags() {
    return $('<p></p>').html(textToEscape).text()
}

1

input要素は1行のテキストのみをサポートします

テキスト状態は、要素の値の1行のプレーンテキスト編集コントロールを表します。

function stripHtml(str) {
  var tmp = document.createElement('input');
  tmp.value = str;
  return tmp.value;
}

更新:これは期待どおりに動作します

function stripHtml(str) {
  // Remove some tags
  str = str.replace(/<[^>]+>/gim, '');

  // Remove BB code
  str = str.replace(/\[(\w+)[^\]]*](.*?)\[\/\1]/g, '$2 ');

  // Remove html and line breaks
  const div = document.createElement('div');
  div.innerHTML = str;

  const input = document.createElement('input');
  input.value = div.textContent || div.innerText || '';

  return input.value;
}

動作しません。回答を投稿するときに、使用しているブラウザを常に言及してください。これは不正確でChrome 61では機能しません。タグは文字列としてレンダリングされるだけです。
vdegenne、2017年

0
    (function($){
        $.html2text = function(html) {
            if($('#scratch_pad').length === 0) {
                $('<div id="lh_scratch"></div>').appendTo('body');  
            }
            return $('#scratch_pad').html(html).text();
        };

    })(jQuery);

これをjqueryプラグインとして定義し、次のように使用します。

$.html2text(htmlContent);

これはユーザー入力から来ているとしましょう。スクリプトまたはマクロをページに追加するために使用できます
Oluwatumbi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.