[C#] C # 정규식을 사용하여 HTML 태그 제거

C # 정규식을 사용하여 꺾쇠 괄호를 포함한 모든 HTML 태그를 바꾸거나 제거하려면 어떻게합니까? 누군가 코드를 도와 줄 수 있습니까?



답변

이전에 자주 언급했듯이 정규식을 사용하여 XML 또는 HTML 문서를 처리해서는 안됩니다. 중첩 된 구조를 일반적인 방식으로 표현할 수있는 방법이 없기 때문에 HTML 및 XML 문서에서 잘 수행되지 않습니다.

다음을 사용할 수 있습니다.

String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);

이것은 대부분의 경우 작동하지만 예상대로 작동하지 않는 경우 (예 : 꺾쇠 괄호가 포함 된 CDATA)가 있습니다.


답변

정답은 그렇지 않습니다 . HTML 민첩성 팩을 사용하십시오 .

추가하기 위해 편집 :

jesse가 아래의 코멘트에서 뻔뻔스럽게 훔치지 않고 이번에 질문에 부적절하게 대답했다는 비난을 피하기 위해 HTML 민첩성 팩을 사용하는 간단하고 신뢰할 수있는 스 니펫이 있습니다.

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Properties.Resources.HtmlContents);
var text = doc.DocumentNode.SelectNodes("//body//text()").Select(node => node.InnerText);
StringBuilder output = new StringBuilder();
foreach (string line in text)
{
   output.AppendLine(line);
}
string textOnly = HttpUtility.HtmlDecode(output.ToString());

HTML을 구문 분석하기 위해 정규 표현식을 사용하는 방어적인 경우는 거의 없습니다. 비전형 정규식 엔진에서도 제공하기가 매우 까다로운 컨텍스트 인식없이 HTML을 올바르게 구문 분석 할 수 없기 때문입니다. RegEx를 사용하면 어느 정도 갈 수 있지만 수동 확인을 수행해야합니다.

HTML Agility Pack은 HTML을 문맥없는 문법으로 순진하게 처리하여 발생할 수있는 수차를 수동으로 수정해야하는 강력한 솔루션을 제공합니다.

정규식은 대부분 대부분 원하는 것을 얻을 수 있지만 매우 일반적인 경우에는 실패합니다. HTML Agility Pack보다 더 나은 / 빠른 파서를 찾을 수 있다면 갈아 타십시오. 그러나 세상이 더 깨진 HTML 해커에 노출되지 않도록하십시오.


답변

질문이 너무 광범위하여 결정적으로 대답 할 수 없습니다. 웹 페이지와 같은 실제 HTML 문서에서 모든 태그를 제거하는 것에 대해 이야기하고 있습니까? 그렇다면 다음을 수행해야합니다.

  • <! DOCTYPE 선언 또는 존재하는 경우 <? xml 프롤로그를 제거하십시오.
  • 모든 SGML 주석 제거
  • 전체 HEAD 요소 제거
  • 모든 SCRIPT 및 STYLE 요소를 제거하십시오.
  • FORM 및 TABLE 요소로 Grabthar-knows-what을 수행
  • 남은 태그를 제거
  • CDATA 섹션에서 <! [CDATA [and]]> 시퀀스를 제거하되 내용은 그대로 두십시오.

그것은 내 머리 꼭대기에 있습니다. 더 많은 것이있을 것입니다. 모든 것을 마치면 어떤 곳에서는 단어, 문장 및 단락이 결합되고 다른 곳에서는 쓸모없는 공백이 생깁니다.

그러나 조각으로 만 작업하고 모든 태그를 제거하는 것으로 벗어날 수 있다고 가정하면 여기에 사용할 정규 표현식이 있습니다.

@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"

작은 따옴표와 큰 따옴표로 묶은 문자열을 다른 방법으로 일치 시키면 속성 값의 꺾쇠 괄호 문제를 해결할 수 있습니다. Ryan의 답변에있는 정규 표현식과 같이 태그 내부의 속성 이름 및 기타 항목을 명시 적으로 일치시킬 필요가 없습니다. 첫 번째 대안은이 모든 것을 처리합니다.

이러한 (?>...)구조 에 대해 궁금한 경우 원자 그룹 입니다. 정규식을 좀 더 효율적으로 만들지 만 더 중요한 점은 런 어웨이 역 추적을 방지하는 것입니다. 나는 그것이 그것이 여기서 문제가 될 것이라고 생각하지 않지만, 그것을 언급하지 않으면 다른 누군가가 알 것입니다. 😉

이 정규 표현식은 물론 완벽하지는 않지만 필요한만큼 좋을 것입니다.


답변

Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline);

출처


답변

@JasonTrue는 HTML 태그 제거가 정규식을 통해 수행되지 않아야한다는 것이 맞습니다.

HtmlAgilityPack을 사용하여 HTML 태그를 제거하는 것은 매우 간단합니다.

public string StripTags(string input) {
    var doc = new HtmlDocument();
    doc.LoadHtml(input ?? "");
    return doc.DocumentNode.InnerText;
}


답변

때로는 Html을 순진하게 구문 분석하고 텍스트 내용을 꺼내야하지만 Jason의 응답을 에코하고 싶습니다.

풍부한 텍스트 편집기, 항상 재미와 게임으로 만든 일부 HTML 로이 작업을 수행해야했습니다.

이 경우 태그 자체뿐만 아니라 일부 태그의 컨텐츠를 제거해야 할 수도 있습니다.

내 경우에는 태그 가이 믹스에 던져졌습니다. 어떤 사람은 내 (매우) 덜 순진한 구현이 유용한 출발점이라고 생각할 수 있습니다.

   /// <summary>
    /// Removes all html tags from string and leaves only plain text
    /// Removes content of <xml></xml> and <style></style> tags as aim to get text content not markup /meta data.
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public static string HtmlStrip(this string input)
    {
        input = Regex.Replace(input, "<style>(.|\n)*?</style>",string.Empty);
        input = Regex.Replace(input, @"<xml>(.|\n)*?</xml>", string.Empty); // remove all <xml></xml> tags and anything inbetween.  
        return Regex.Replace(input, @"<(.|\n)*?>", string.Empty); // remove any tags but not there content "<p>bob<span> johnson</span></p>" becomes "bob johnson"
    }


답변

이 URL에서 정규 표현식 방법을 시도 하십시오 : http://www.dotnetperls.com/remove-html-tags

/// <summary>
/// Remove HTML from string with Regex.
/// </summary>
public static string StripTagsRegex(string source)
{
return Regex.Replace(source, "<.*?>", string.Empty);
}

/// <summary>
/// Compiled regular expression for performance.
/// </summary>
static Regex _htmlRegex = new Regex("<.*?>", RegexOptions.Compiled);

/// <summary>
/// Remove HTML from string with compiled Regex.
/// </summary>
public static string StripTagsRegexCompiled(string source)
{
return _htmlRegex.Replace(source, string.Empty);
}