어떤 태그가 포함되어 있는지 모르고 문자열에서 모든 HTML 태그를 제거하려면 어떻게해야합니까?


122

모든 HTML 태그 또는 문자열에서 관련된 모든 HTML을 제거하는 쉬운 방법이 있습니까?

예를 들면 :

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)"

위의 내용은 실제로 다음과 같아야합니다.

"헐크 호건의 연예인 선수권 레슬링 [Proj # 206010] (리얼리티 시리즈)"


이 질문은 중복으로 인해 종료되었지만 Html Agility Pack을 사용하여 제안 된 답변이 제공됩니다. Html Agility Pack을 사용하지 않고 html 태그를 제거하려면 여기에서 내 대답을 참조하십시오 . stackoverflow.com/a/30026043/2318354 . 어떤 사람에게 도움이 될 수있는
Dilip0165

6
이것은 "HTML 민첩성 팩-콘텐츠를 제거하지 않고 원치 않는 태그를 제거 하시겠습니까?"와 같이 중복되지 않습니다. 일부 태그를 유지하려고합니다 (즉, 유효한 태그 목록을 제공하고 나머지는 제거). 이 질문은 모든 태그 제거에 관한 것입니다. 그리고 존재하는 모든 html 태그 목록을 전달하지 않을 것이므로 다른 질문의 답변을 사용할 수 없습니다.
Thierry_S

xidel을 살펴 보십시오 . .NET을 사용하면 95 %가 소요됩니다 xidel -s input -e '/'.
Josh Habdas

답변:


247

다음과 같은 간단한 정규식을 사용할 수 있습니다.

public static string StripHTML(string input)
{
   return Regex.Replace(input, "<.*?>", String.Empty);
}

이 솔루션에는 자체 결함이 있습니다. 자세한 내용 은 문자열에서 HTML 태그 제거를 참조 하십시오 (특히 @mehaase의 주석).

또 다른 해결책은 HTML Agility Pack 을 사용하는 것 입니다.
여기에서 라이브러리를 사용하는 예를 찾을 수 있습니다. HTML 민첩성 팩-콘텐츠를 제거하지 않고 원치 않는 태그를 제거 하시겠습니까?


2
입력 작동하지 않습니다 : '7 <10 <B>하지만 </ B> 30> (10')이 제공 : '7하지만 30> (10')
바르 토스 Pierzchlewicz

이 사이에있는 모든 스트립 때문에 예, <와>, 그래서 귀하의 경우, < 10 <b></b>모두 제거됩니다.
Bidou

2
메서드 이름은 Pascal 대소 문자를 사용해야하므로 메서드 이름은 StripHtml ()이 아니어야합니까?
David Klempfner

이를 위해 정규식을 사용하는 것은 보안상의 이유로 사용하는 경우 좋은 생각이 아닐 수 있습니다.
Mathias Lykkegaard Lorenzen

3
정규식을 <[a-zA-Z /] *?>로 변경하세요.
Brandon Prudent

54

Html Agility Pack을 사용하여 문자열을 구문 분석 하고 InnerText를 가져올 수 있습니다.

    HtmlDocument htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(@"<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)");
    string result = htmlDoc.DocumentNode.InnerText;

InnerText모든 태그를 제거 하므로 솔루션이 마음에 듭니다. 하지만 ... 그것은 뒤에 잎 &nbsp;과 같은 또한 주석 태그 <!-- xxx --> 주변의 것과 같은 v:shapetype, v:shape또는 v:imagedata[if gte vml 1]또는[if !vml]
Thierry_S

7
나는 그것이 &nbsp;태그가 아니라 html 엔티티 라는 것을 알고 있습니다 . 그래서 result = WebUtility.HtmlDecode(result);Html Agility Pack을 사용하여 주석 노드를 제거하고 제거 할 수있는 솔루션입니다 . htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());하기 직전에result = htmlDoc.DocumentNode.InnerText;
Thierry_S

3

아래 코드를 문자열에 사용할 수 있으며 html 부분없이 완전한 문자열을 얻을 수 있습니다.

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)".Replace("&nbsp;",string.Empty);            
        string s = Regex.Replace(title, "<.*?>", String.Empty);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.