Regex를 사용하여 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;
brianary

작동하지 않습니다. 특히 짧은 태그에서는 실패합니다. is-thought.co.uk/book/sgml-9.htm#SHORTTAG
Mike Samuel

4
이것은 오래된 질문이지만 여기에 게시하겠습니다 : jsperf.com/regex-replace-vs-jquery-text
Joshua

2
에서 실행 해보십시오 "<img src=bogus onerror=alert(1337)". 첫 번째는 HTML 파서가 마지막 태그를로 닫을 필요 >가 없기 때문에 실패하고, 두 번째는 파싱 된 DOM 트리가 DOM에 추가되기 전에 이미지로드가 시작 $('<img ...>')되어 HTML 파서를 호출 하기 때문에 실패합니다 .
Mike Samuel

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

브라우저에서 개체 필드가없는innerText
아드리안

@Adrian 마지막 줄은 temp.textContent존재 하는 경우 출력을 선택하고 temp.innerText그렇지 않은 경우 에만 시도 합니다. :) 브라우저가 이전을해야하지만하지 않는 브라우저, 후자가 대신 사용됩니다
jsdw

이것을 다시 살펴본 후 (너무 많은 답변이 있습니다). 이 방법을 사용하고 있습니다. 이것은 텍스트 각도에서 사용되는 것과 동일한 방법입니다. 그들은 내가이 스레드에 포함 된 한 여분의 몇 가지 추가 한
Rentering.com

이 솔루션은 실패했으며 Angular에 @kolkov Text Editor를 사용하고 있습니다.
와세 엠 아마드 나임

10

이것은 나를 위해 일했습니다.

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

5
+1 감사합니다. 이 하나의 라이너는 내 요구에 완벽하게 맞았습니다. console.log( my_html.replace(/(&nbsp;|<([^>]+)>)/ig, "") );
DaveAlger 2015 년

6

TextAngular (WYSISYG Editor)가 수행하는 방법은 다음과 같습니다. 나는 또한 이것이 가장 일관된 대답 인 NO REGEX라는 것을 발견했습니다.

@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
나는 소스를 보았고 실제로 내부적으로 다른 답변에서 제안 된 동일한 정규식을 사용합니다.
유진

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."); } };
프레드 락 Stojadinović에게

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 를 만듭니다 .

그런 다음 조각의 텍스트를 가져 와서 "보이지 않는"/ 폭이 0 인 문자를 제거하고 선행 / 후행 공백을 제거합니다.

나는이 질문이 오래되었다는 것을 알고 있으며, 내 솔루션이 독특하다고 생각하고 공유하고 싶었습니다. :)

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.