텍스트 JavaScript에서 HTML 제거


655

JavaScript에서 html 문자열을 가져 와서 html을 제거하는 쉬운 방법이 있습니까?

답변:


761

브라우저에서 실행중인 경우 가장 쉬운 방법은 브라우저가 브라우저 를 대신 하도록하는 것입니다 ...

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

참고 : 사람들이 주석에서 언급했듯이 HTML 소스를 제어하지 않으면 (예를 들어 사용자 입력에서 얻을 수있는 것에서 실행하지 마십시오) 피하는 것이 가장 좋습니다. 이러한 시나리오의 경우 에도 브라우저에서 작업을 수행 할 수 있습니다 . 현재 널리 사용되는 DOMParser 사용에 대한 Saba의 답변을 참조하십시오 .


40
이 접근법은 다소 일관성이 없으며 특정 브라우저에서 특정 문자를 제거하지 못합니다. 예를 들어, Prototype.js에서는이 접근 방식을 성능에 사용하지만 일부 결함 ( github.com/kangax/prototype/blob/…)을 해결합니다.
kangax

11
공백이 엉망이 될 것임을 기억하십시오. 나는이 방법을 사용했지만 특정 제품 코드에 이중 공백이 포함되어있어 문제가 발생했습니다 .DIV에서 innerText를 다시 얻은 후 단일 공백으로 끝났습니다. 그런 다음 응용 프로그램에서 제품 코드가 일치하지 않았습니다.
Magnus Smith

11
@ Magnus Smith : 예. 공백이 문제가되는 경우 또는 작업중인 특정 HTML DOM과 직접 관련이없는이 텍스트가 필요한 경우 다른 하나를 사용하는 것이 좋습니다. 여기에 주어진 해결책. 이 방법의 주요 장점은 1) 사소한 것이며 2)에서 실행중인 브라우저와 같은 방식으로 태그, 공백, 엔티티, 주석 등을 안정적으로 처리한다는 것 입니다 . 웹 클라이언트 코드에는 종종 유용하지만 규칙이 다른 다른 시스템과 상호 작용하는 데 반드시 필요한 것은 아닙니다.
Shog9

220
신뢰할 수없는 소스의 HTML에는 이것을 사용하지 마십시오. 이유를 알아 보려면strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
Mike Samuel

24
html에 이미지 (img 태그)가 포함 된 경우 이미지는 브라우저에서 요청합니다. 그 좋지 않다.
douyw

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

4
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)" via를 주입 document.write하거나 >via를 주입하기 전에 를 포함하는 문자열과 연결 하는 경우 에는 작동하지 않습니다 innerHTML.
Mike Samuel

1
@ PerishableDave, 나는 >두 번째에 남을 것에 동의합니다 . 그것은 주입 위험이 아닙니다. <첫 번째 문자가 왼쪽 으로 인해 위험이 발생 하여 두 번째 시작시 HTML 구문 분석기가 데이터 상태 이외의 컨텍스트에있게 됩니다. 에 데이터 상태에서 전환이 없습니다 >.
Mike Samuel

73
@MikeSamuel 우리는 아직이 답변을 결정 했습니까? 순진한 사용자가 여기에서 복사하여 붙여 넣을 준비가되었습니다.
Ziggy

1
또한 <button onClick="dostuff('>');"></button>올바르게 작성된 HTML이라고 가정하는 경우 속성의 인용 된 텍스트 어딘가보다 큰 기호가있을 수 있다는 점을 고려해야합니다. 또한 <script>적어도 태그 안의 모든 텍스트를 제거하고 싶을 것 입니다.
Jonathon

15
@AntonioMax, 나는이 질문 ad nauseam에 답변 했지만 보안 중요한 코드는 복사하여 붙여 넣지 않아야 하기 때문에 귀하의 질문에 달려 있습니다. 최근에 발견 된 취약점과 브라우저의 변경 사항에 대비하여 라이브러리를 다운로드하고 최신 상태로 유지하고 패치를 유지해야합니다.
Mike Samuel

249

가장 간단한 방법 :

jQuery(html).text();

html 문자열에서 모든 텍스트를 검색합니다.


111
프로젝트에는 항상 자바 스크립트가 많기 때문에 항상 프로젝트에 jQuery를 사용합니다. 따라서 우리는 대량으로 추가하지 않고 기존 API 코드를 활용했습니다.
Mark

32
사용하지만 OP는 사용하지 않을 수 있습니다. 질문은 Javascript NOT JQuery에 관한 것입니다.
Dementic

105
OP와 같은 일을해야하고 (나 같은) jQuery를 사용하는 것을 신경 쓰지 않는 사람들에게는 여전히 유용한 대답입니다. jQuery. 사이트의 요점은 지식을 공유하는 것입니다. 정당한 이유없이 유용한 답변을 추격함으로써 얻을 수있는 냉기 효과를 명심하십시오.
acjay

27
@Dementic 놀랍게도, 여러 답변이있는 스레드가 가장 유용하다는 것을 알았습니다. 보조 답변이 내 정확한 요구를 충족시키는 반면 기본 답변은 일반적인 경우를 충족하기 때문입니다.
Eric Goldberg

36
문자열의 일부가 html 태그로 싸여 있지 않으면 작동하지 않습니다. 예 : "<b> 오류 : </ b> 유효한 이메일을 입력하십시오"는 "오류 :"만 반환합니다
Aamir Afridi

127

Shog9 의 승인 된 답변의 편집 된 버전을 공유하고 싶습니다 .


Mike Samuel 이 주석으로 지적한 것처럼 이 함수는 인라인 자바 스크립트 코드를 실행할 수 있습니다.
그러나 Shog9 "브라우저가 대신 해줄 것"이라고 말할 때 가 옳습니다.

그래서 .. 여기 DOMParser를 사용하여 편집 한 버전 :

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

다음은 인라인 자바 스크립트를 테스트하는 코드입니다.

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

1
이것은 태그를 제거하는 것이 아니라 PHP htmlspecialchars ()와 비슷합니다. 여전히 나에게 유용합니다.
Daantje

이렇게하면 텍스트의 시작 부분에서 공백이 제거됩니다.
Raine Revere

또한, 이것은 웹 워커에서 작동합니다
Chris Seufert

이것은 @ Shog9의 답변보다 훨씬 빠른 것 같습니다
Shmuel Kamensky

55

문자열에 HTML이 포함되어 있지 않은 경우 (예 : 양식 필드에서 HTML을 제거하려는 경우) jQuery 메소드의 확장으로

jQuery(html).text();`

HTML이 없으면 빈 문자열을 반환합니다

사용하다:

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

대신에.

업데이트 : 의견에서 지적했듯이 어떤 상황 에서이 솔루션은 공격자의 영향 htmlhtml받을 수있는 경우 안에 포함 된 자바 스크립트를 실행 하고 다른 솔루션을 사용합니다.


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

41

하이퍼 링크 (a href)를 그대로 유지하면서 일반 텍스트 전자 메일로 HTML 변환

hypoxide에 의해 게시 된 위의 기능은 정상적으로 작동하지만 기본적으로 웹 RichText 편집기 (예 : 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). 여기서 $1href URL / URI $2는 하이퍼 링크 텍스트입니다. 일반 텍스트 본문에 직접 링크가 있으면 대부분의 SMTP 메일 클라이언트가이를 변환하여 사용자가 해당 링크를 클릭 할 수 있습니다.

이 정보가 도움이 되길 바랍니다.


"& nbsp;"를 처리하지 않습니다.
Rose Nettoyeur

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 이상이 안전합니다. 오페라 프레스토는 여전히 취약하다. 또한 문자열에 언급 된 이미지는 Chromium 및 Firefox에서 http 요청을 저장하여 다운로드되지 않습니다.


이것은 몇 가지 방법이지만 안전하지는 않습니다<script><script>alert();
Arth

1
Linux의 Chromium / Opera / Firefox에서 스크립트를 실행하지 않으므로 왜 안전하지 않습니까?
Janghou

내 사과, 내가 잘못 테스트해야합니다, 아마도 jsFiddle에서 다시 실행을 클릭 잊어 버렸습니다.
Arth

"새로운"주장은 불필요한 것 같아요?
존 슈나이더

사양 에 따르면 요즘은 선택 사항이지만 항상 그런 것은 아닙니다.
Janghou

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>
pstanton

@ pstanton 코드를 수정하고 주석을 추가했습니다. 늦은 답변에 죄송합니다.
Karl.S

16

Jibberboy2000의 답변 을 수정 하여 여러 <BR />태그 형식 을 포함하고 내부 <SCRIPT><STYLE>태그 안의 모든 것을 제거하고 여러 줄 바꿈과 공백을 제거하여 결과 HTML을 형식화하고 일부 HTML 인코딩 코드를 일반으로 변환했습니다. 일부 테스트 후 전체 웹 페이지의 대부분을 페이지 제목과 내용이 유지되는 간단한 텍스트로 변환 할 수 있습니다.

간단한 예에서

<!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

좋은 대본. 그러나 테이블 내용은 어떻습니까? 이 표시 할 수있는 방법을 어떤 생각
흐리 스토 Enev

@DanielGerson, HTML 인코딩은 정말 털이 많고 빠르지 만 가장 좋은 방법은 he 라이브러리를 사용하는 것 같습니다
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보다 덜 우아한 다른 솔루션은 <body> 태그에서 시작하여 DOM을 재귀 적으로 살펴보고 각 텍스트 노드를 추가하는 것입니다.

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
yikes. 문자열에서 DOM 트리를 만들려면 shog 's way를 사용하십시오!
nickf

예, 내 솔루션은 일반 망치가 더 적합한 썰매 망치를 사용합니다 :-). 그리고 귀하와 Shog9의 솔루션이 더 우수하고 기본적으로 답변에서 많이 말한 것에 동의합니다. 또한 HTML에 문자열이 이미 포함되어 있다는 응답에 반영하지 못했습니다. 어쨌든 원래 질문과 관련하여 본질적으로 쓸모가 없습니다. :-(
Bryan

1
공평하게 말하면, 이것은 가치가 있습니다-텍스트의 / all /을 반드시 보존해야한다면, 줄 바꿈, 탭, 캐리지 리턴 등을 캡처하는 데 알맞은 샷이 있습니다. , 그리고 훨씬 빨리 ... eh.
Shog9

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가 요구 한 것, 즉 Byron이 아래에서 대답 한 것 (Byron 만 [^>]잘못 알고 있음) 이라고 생각할 때 더 빠르게 만들 수 있습니다 .
Alexis Wilke

1
allowed매개 변수 를 사용하면 XSS에 취약합니다. stripTags('<p onclick="alert(1)">mytext</p>', '<p>')반환<p onclick="alert(1)">mytext</p>
Chris Cinelli

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>.
Logan Pickup

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

당신은 변경해야합니다 [^<>]으로[^>] 유효한 태그가 포함 할 수 없기 때문에 <문자를, 다음 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("");

그러나 다른 이유로도 완벽한 솔루션은 아닙니다.


텍스트가 사용자 입력 (텍스트 영역 또는 컨텐츠 편집 가능 위젯)에서 오는 경우 많은 상황에서 실패합니다.
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));

웹 기반 환경을위한 훌륭한 솔루션! ECMAScript 2015 이후 블록 범위 변수가 이미 letconst연산자 를 사용하여 블록 범위를 올바르게 지정 했으므로 IIFE를 사용하지 않아야합니다 . 또한 귀하의 솔루션을 iframes사용하여 문서 내부에서 사용되지 않은 것에 대한 많은 참고 자료를 얻었습니다 . document.body.removeChild(sandbox)미래의 복사 파스타 기반 독자를 위해 코드에 코드를 추가하는 것을 고려하십시오 .
아민 NAIRI

2

jQuery를 사용하면 다음을 사용하여 간단히 검색 할 수 있습니다.

$('#elementID').text()

2

아래 코드를 사용하면 일부 HTML 태그를 유지하면서 다른 모든 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)를 인용해야합니다 . 이 allowed매개 변수 를 사용하면 XSS에 취약합니다. stripTags('<p onclick="alert(1)">mytext</p>', '<p>')반환<p onclick="alert(1)">mytext</p>
Chris Cinelli

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과 같은 도구를 사용하여 웹 응용 프로그램을 압축하면 노드와 브라우저 모두에서 작동합니다.


2

방금 스트립을 제거해야했습니다 <a> 태그 하고 링크 텍스트로 교체해야했습니다.

이것은 잘 작동하는 것 같습니다.

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

이것은 태그에만 적용되며 광범위한 기능을 위해 조정이 필요합니다.
m3nda

예, 앵커 태그에는와 같은 다른 많은 속성이있을 수 있습니다 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요소 는 한 줄 텍스트 만 지원합니다 .

텍스트 상태는 요소 값에 대한 한 줄의 일반 텍스트 편집 컨트롤을 나타냅니다.

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

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.