正規表現を使用してJavaScriptのHTMLタグを削除する


108

JavaScriptの文字列からすべてのhtmlタグを削除しようとしています。ここに私が持っているものがあります...なぜそれが機能しないのか分かりません...何か私が間違っていることを知っていますか?

<script type="text/javascript">

var regex = "/<(.|\n)*?>/";
var body = "<p>test</p>";
var result = body.replace(regex, "");
alert(result);

</script>

どうもありがとう!

回答:


237

HTMLの文法が複雑すぎて正規表現を100%正しく処理できないことに注意してください。

var regex = /(<([^>]+)>)/ig
,   body = "<p>test</p>"
,   result = body.replace(regex, "");

console.log(result);

jQueryなどのライブラリを使用する場合は、次のようにするだけです。

console.log($('<p>test</p>').text());

2
なぜ正規表現を文字列で囲むのですか?var regex = /(<([^>] +)>)/ ig;
ブライアリー2009

これは機能しません。具体的には、短いタグでは失敗します:is-thought.co.uk/book/sgml-9.htm#SHORTTAG
Mike Samuel

4
これは古い質問ですが、ここに投稿します。jsperf.com
Joshua

2
でこれを実行してみてください"<img src=bogus onerror=alert(1337)"。最初のコードは、HTMLパーサーが最後のタグをで閉じる必要がないために>失敗し、2番目のコードは、解析されたDOMツリーがDOMに追加される前に画像の読み込みが開始され$('<img ...>')、HTMLパーサーを呼び出すために失敗します。
マイクサミュエル

1
正規表現ソリューションは>、属性値にa が含まれている場合も失敗します。このように<div data="a + b > c">
MT0

34

これは古い質問ですが、偶然見つけて、私が使用した方法を共有したいと思いました。

var body = '<div id="anid">some <a href="link">text</a></div> and some more text';
var temp = document.createElement("div");
temp.innerHTML = body;
var sanitized = temp.textContent || temp.innerText;

sanitized 含まれるようになります: "some text and some more text"

jQueryは必要ありません。より複雑な場合でも失望させません。


ヒヤ。まあ、基本的には、新しいDIVを作成し、内部のHTMLコンテンツを提供されたものに設定し(これは、HTMLコードが解析されることを意味します)、divのすべてのテキストコンテンツを要求します。 。
jsdw 2013年

私のブラウザでは、オブジェクトにフィールドがありませんinnerText
エイドリアン

@Adrian最後の行は、temp.textContent存在する場合に出力を選択し、存在temp.innerTextしない場合にのみ試行します。ブラウザには前者が必要ですが、そうでない場合は後者が代わりに使用されます:)
jsdw

これをもう一度調べた後(そこには非常に多くの答えがあります)。この方法を使用しています。これは、text-angularで使用される方法と同じです。彼らは私がこのスレッドに含めたいくつかのエキストラを追加しました
Rentering.com

このソリューションは失敗しました。@ kolkov Text Editor for Angularを使用しています。
Waseem Ahmad Naeem

10

これでうまくいきました。

   var regex = /(&nbsp;|<([^>]+)>)/ig
      ,   body = tt
     ,   result = body.replace(regex, "");
       alert(result);

5
+1ありがとうございます。このワンライナーは私のニーズにぴったりなものでした。console.log( my_html.replace(/(&nbsp;|<([^>]+)>)/ig, "") );
DaveAlger、

6

TextAngular(WYSISYGエディター)がこれを行う方法を次に示します。また、これが最も一貫した答えであることがわかりました。これは正規表現ではありません。

@license textAngular
Author : Austin Anderson
License : 2013 MIT
Version 1.5.16
// turn html into pure text that shows visiblity
function stripHtmlToText(html)
{
    var tmp = document.createElement("DIV");
    tmp.innerHTML = html;
    var res = tmp.textContent || tmp.innerText || '';
    res.replace('\u200B', ''); // zero width space
    res = res.trim();
    return res;
}

2

undrescore.string.jsである管理文字列用の強力なライブラリを使用できます

_('a <a href="#">link</a>').stripTags()

=> 'リンク'

_('a <a href="#">link</a><script>alert("hello world!")</script>').stripTags()

=> 'a linkalert( "hello world!")'

このlibを次のようにインポートすることを忘れないでください。

        <script src="underscore.js" type="text/javascript"></script>
        <script src="underscore.string.js" type="text/javascript"></script>
        <script type="text/javascript"> _.mixin(_.str.exports())</script>

2
私はソースを見て、彼らは実際には他の回答で提案された同じ正規表現を内部で使用しています。
ユージーン2014年

2

FuncJSと呼ばれる私の単純な JavaScriptライブラリーには、「strip_tags()」と呼ばれる関数があり、正規表現を入力することなくタスクを実行します。

たとえば、文からタグを削除するとします。この関数を使用すると、次のように簡単に実行できます。

strip_tags("This string <em>contains</em> <strong>a lot</strong> of tags!");

これにより、「この文字列には多くのタグが含まれています!」が生成されます。

よりよく理解するために、GitHub FuncJSのドキュメントを読んでください 。

また、必要に応じて、フォームからフィードバックを提供してください。とても助かります!


strip_tags()ライブラリを宣伝するだけでなく、それを説明するのではなく、何を提供するのでしょうか?リンクは、APIの使用法を説明しなくそれが何をしますか
Justin Beaudry 2013年

1
まあ、彼が与えたそのウェブサイトでそれを見つけましたstrip_tags = function(e) { var _hasTag, _tag_string; if (!(e === void 0 || e === null || e === "")) { _tag_string = e; if (typeof _tag_string === "object") { _tag_string = _tag_string.outerHTML; } _hasTag = _tag_string.match(/(<([^>]+)>)/ig); if (_hasTag) { return trim(_tag_string.replace(/(<([^>]+)>)/ig, '')); } else { return trim(_tag_string); } } else { throw new Error("The 'strip_tags' function expects one argument in the form of a string or object."); } };
PredragStojadinović15年

1

これは、HTMLタグや&nbspなどのソリューションであり、条件を削除および追加して、HTMLなしでテキストを取得し、任意のテキストに置き換えることができます。

convertHtmlToText(passHtmlBlock)
{
   str = str.toString();
  return str.replace(/<[^>]*(>|$)|&nbsp;|&zwnj;|&raquo;|&laquo;|&gt;/g, 'ReplaceIfYouWantOtherWiseKeepItEmpty');
}


0
<html>
<head>
<script type="text/javascript">
function striptag(){
var html = /(<([^>]+)>)/gi;
for (i=0; i < arguments.length; i++)
arguments[i].value=arguments[i].value.replace(html, "")
}
</script>
</head> 
<body>
       <form name="myform">
<textarea class="comment" title="comment" name=comment rows=4 cols=40></textarea><br>
<input type="button" value="Remove HTML Tags" onClick="striptag(this.form.comment)">
</form>
</body>
</html>

0

次のような文字列を作成することで無効なHTML文字列を作成することが可能なため、選択した回答がHTMLの除去を常に保証するわけではありません。

  "<<h1>h1>foo<<//</h1>h1/>"

この入力により、ストリッピングによって一連のタグが組み立てられ、次の結果が得られます。

  "<h1>foo</h1>"

さらに、jqueryのテキスト関数は、タグで囲まれていないテキストを削除します。

以下は、jQueryを使用する関数ですが、これらの両方のケースに対してより堅牢なはずです。

var stripHTML = function(s) {
    var lastString;

    do {            
        s = $('<div>').html(lastString = s).text();
    } while(lastString !== s) 

    return s;
};

0

私のやり方は、実質的にワンライナーです。

この関数はRangeオブジェクトを作成してから、その文字列を子コンテンツとしてRangeにDocumentFragmentを作成します。

次に、フラグメントのテキストを取得し、「非表示」/ゼロ幅の文字を削除し、先頭/末尾の空白を削除します。

この質問が古いことに気付きました。私のソリューションはユニークで、共​​有したいと思っていました。:)

function getTextFromString(htmlString) {
    return document
        .createRange()
        // Creates a fragment and turns the supplied string into HTML nodes
        .createContextualFragment(htmlString)
        // Gets the text from the fragment
        .textContent
        // Removes the Zero-Width Space, Zero-Width Joiner, Zero-Width No-Break Space, Left-To-Right Mark, and Right-To-Left Mark characters
        .replace(/[\u200B-\u200D\uFEFF\u200E\u200F]/g, '')
        // Trims off any extra space on either end of the string
        .trim();
}

var cleanString = getTextFromString('<p>Hello world! I <em>love</em> <strong>JavaScript</strong>!!!</p>');

alert(cleanString);

-1

他の人が述べたように、正規表現は機能しません。正規表現を使用してhtmlを解析できない、またはできないことについての私の記事を読んでください。これは、ソース文字列からhtmlを取り除こうとしているときに行うことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.