回答:
HTMLの文法が複雑すぎて正規表現を100%正しく処理できないことに注意してください。
var regex = /(<([^>]+)>)/ig
, body = "<p>test</p>"
, result = body.replace(regex, "");
console.log(result);
jQueryなどのライブラリを使用する場合は、次のようにするだけです。
console.log($('<p>test</p>').text());
"<img src=bogus onerror=alert(1337)"
。最初のコードは、HTMLパーサーが最後のタグをで閉じる必要がないために>
失敗し、2番目のコードは、解析されたDOMツリーがDOMに追加される前に画像の読み込みが開始され$('<img ...>')
、HTMLパーサーを呼び出すために失敗します。
>
、属性値にa が含まれている場合も失敗します。このように<div data="a + b > c">
これは古い質問ですが、偶然見つけて、私が使用した方法を共有したいと思いました。
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は必要ありません。より複雑な場合でも失望させません。
innerText
temp.textContent
存在する場合に出力を選択し、存在temp.innerText
しない場合にのみ試行します。ブラウザには前者が必要ですが、そうでない場合は後者が代わりに使用されます:)
これでうまくいきました。
var regex = /( |<([^>]+)>)/ig
, body = tt
, result = body.replace(regex, "");
alert(result);
console.log( my_html.replace(/( |<([^>]+)>)/ig, "") );
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;
}
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>
FuncJSと呼ばれる私の単純な JavaScriptライブラリーには、「strip_tags()」と呼ばれる関数があり、正規表現を入力することなくタスクを実行します。
たとえば、文からタグを削除するとします。この関数を使用すると、次のように簡単に実行できます。
strip_tags("This string <em>contains</em> <strong>a lot</strong> of tags!");
これにより、「この文字列には多くのタグが含まれています!」が生成されます。
よりよく理解するために、GitHub FuncJSのドキュメントを読んでください 。
また、必要に応じて、フォームからフィードバックを提供してください。とても助かります!
strip_tags()
ライブラリを宣伝するだけでなく、それを説明するのではなく、何を提供するのでしょうか?リンクは、APIの使用法を説明しなくそれが何をしますか。
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."); } };
JSでの適切なHTMLサニタイザーについては、http://code.google.com/p/google-caja/wiki/JsHtmlSanitizerを参照してください
<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>
次のような文字列を作成することで無効な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;
};
私のやり方は、実質的にワンライナーです。
この関数は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);