ASP.NET의 문자열에서 HTML 태그를 제거하려면 어떻게해야합니까? 태그를 안정적으로 제거 할 수 있습니까 (예

ASP.NET을 사용하여 어떻게 주어진 문자열에서 HTML 태그를 안정적으로 제거 할 수 있습니까 (예 : 정규식을 사용하지 않음)? PHP와 같은 것을 찾고 strip_tags있습니다.

예:

<ul><li>Hello</li></ul>

산출:

“여보세요”

나는 바퀴를 재발 명하지 않으려 고 노력하고 있지만 지금까지 내 요구를 충족시키는 것을 찾지 못했습니다.



답변

문자열에서 모든 HTML 태그를 제거 하는 경우 정규식에서도 안정적 으로 작동 합니다. 바꾸다:

<[^>]*(>|$)

전역 적으로 빈 문자열로. 나중에 문자열을 정규화하는 것을 잊지 마십시오.

[\s\r\n]+

단일 공간으로 결과를 트리밍합니다. 선택적으로 HTML 문자 엔티티를 실제 문자로 다시 바꿉니다.

참고 :

  1. 제한이 있습니다. HTML 및 XML >은 속성 값을 허용 합니다. 이 솔루션 이러한 값이 발생하면 깨진 마크 업 반환합니다.
  2. 솔루션은 다음과 같이 기술적으로 안전합니다. 결과에는 사이트 간 스크립팅을 수행하거나 페이지 레이아웃을 깨는 데 사용할 수있는 내용이 포함되지 않습니다. 그것은 매우 깨끗하지 않습니다.
  3. 모든 HTML 및 정규식과 마찬가지로 : 모든 상황에서 올바르게 사용해야하는 경우 적절한 구문 분석기를
    사용하십시오 .

답변

지금 HTMLAgilityPack을 다운로드하십시오! 😉 링크 다운로드

이를 통해 HTML을로드하고 구문 분석 할 수 있습니다. 그런 다음 DOM을 탐색하고 모든 속성의 내부 값을 추출 할 수 있습니다. 진지하게, 최대 10 줄의 코드가 필요합니다. 가장 훌륭한 무료 .net 라이브러리 중 하나입니다.

다음은 샘플입니다.

            string htmlContents = new System.IO.StreamReader(resultsStream,Encoding.UTF8,true).ReadToEnd();

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(htmlContents);
            if (doc == null) return null;

            string output = "";
            foreach (var node in doc.DocumentNode.ChildNodes)
            {
                output += node.InnerText;
            }


답변

Regex.Replace(htmlText, "<.*?>", string.Empty);


답변

protected string StripHtml(string Txt)
{
    return Regex.Replace(Txt, "<(.|\\n)*?>", string.Empty);
}

Protected Function StripHtml(Txt as String) as String
    Return Regex.Replace(Txt, "<(.|\n)*?>", String.Empty)
End Function


답변

나는 이것을 asp.net 포럼에 게시했지만 여전히 가장 쉬운 솔루션 중 하나 인 것 같습니다. 가장 빠르거나 가장 효율적이라고 보장하지는 않지만 꽤 신뢰할 수 있습니다. .NET에서는 HTML 웹 컨트롤 개체 자체를 사용할 수 있습니다. 정말 필요한 것은 DIV와 같은 임시 HTML 개체에 문자열을 삽입 한 다음 내장 된 ‘InnerText’를 사용하여 태그 내에 포함되지 않은 모든 텍스트를 가져 오는 것입니다. 간단한 C # 예제는 아래를 참조하십시오.


System.Web.UI.HtmlControls.HtmlGenericControl htmlDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
htmlDiv.InnerHtml = htmlString;
String plainText = htmlDiv.InnerText;


답변

정규식에서 지옥을이기는 C #으로 꽤 빠른 방법을 작성했습니다. CodeProject 의 기사 에서 호스팅됩니다 .

그것의 장점은 더 나은 성능 사이에서, 이름 및 번호 HTML 엔티티 (같은 그 교체 할 수 있습니다 &amp;amp;&203;)과 주석 블록 교체 등을.

CodeProject에 대한 관련 기사를 읽어보십시오 .

감사합니다.


답변

HtmlAgilityPack을 사용할 수없는 사용자에게는 .NETs XML 리더가 옵션입니다. 형식이 잘 지정된 HTML에서는 실패 할 수 있으므로 항상 regx를 백업으로 추가하십시오. 이것은 빠르지는 않지만 디버깅을 통해 구식 단계에 좋은 기회를 제공합니다.

public static string RemoveHTMLTags(string content)
    {
        var cleaned = string.Empty;
        try
        {
            StringBuilder textOnly = new StringBuilder();
            using (var reader = XmlNodeReader.Create(new System.IO.StringReader("<xml>" + content + "</xml>")))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Text)
                        textOnly.Append(reader.ReadContentAsString());
                }
            }
            cleaned = textOnly.ToString();
        }
        catch
        {
            //A tag is probably not closed. fallback to regex string clean.
            string textOnly = string.Empty;
            Regex tagRemove = new Regex(@"<[^>]*(>|$)");
            Regex compressSpaces = new Regex(@"[\s\r\n]+");
            textOnly = tagRemove.Replace(content, string.Empty);
            textOnly = compressSpaces.Replace(textOnly, " ");
            cleaned = textOnly;
        }

        return cleaned;
    }