programing

ASP 문자열에서 HTML 태그를 삭제하려면 어떻게 해야 합니까?인터넷?

showcode 2023. 4. 20. 23:25
반응형

ASP 문자열에서 HTML 태그를 삭제하려면 어떻게 해야 합니까?인터넷?

ASP " . 해야 합니까(NET, 특정 문자열에서 HTML 태그를 확실하게 제거하려면(regex를 사용하지 않음) 어떻게 해야 합니까?PHP를 .strip_tags.

예:

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

출력:

"안녕하세요"

바퀴를 다시 만들지 않으려고 노력하고 있지만, 지금까지 제 요구에 맞는 것을 찾지 못했습니다.

문자열에서 HTML 태그를 모두 삭제하는 경우 regex에서도 안정적으로 동작합니다.대체:

<[^>]*(>|$)

빈 문자열을 글로벌하게 사용합니다.그 후 스트링을 정규화하는 것을 잊지 말고 다음 항목을 치환해 주십시오.

[\s\r\n]+

한 칸의 공백으로 결과를 트리밍합니다.임의로 HTML 문자 엔티티를 실제 문자로 바꿉니다.

주의:

  1. 은 「HTML」을 허가합니다. HTML 'XML">Atribute 값으로 지정합니다.솔루션은 이러한 값이 발견되면 깨진 마크업을 반환합니다.
  2. 솔루션은 다음과 같이 기술적으로 안전합니다.이 결과에는 사이트 간 스크립팅을 수행하거나 페이지 레이아웃을 깨는 데 사용할 수 있는 항목이 포함되지 않습니다.그것은 단지 매우 깨끗하지 않을 뿐이다.
  3. HTML regex:
    모든 상황에서 올바르게 해석해야 할 경우 적절한 파서를 사용하십시오.

지금 바로 HTMLAgilityPack을 다운로드하세요!;) LInk 다운로드

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 Web Control 개체 자체를 사용할 수 있습니다.DIV와 같은 임시 HTML 오브젝트에 문자열을 삽입하고 내장된 'Inner'를 사용하면 됩니다.Text'는 태그에 포함되지 않은 모든 텍스트를 가져옵니다.간단한 C#의 예에 대해서는, 이하를 참조해 주세요.


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

나는 정규식을 능가하는 꽤 빠른 방법을 c#로 작성했다.이것은 Code Project에 관한 기사에 게재되어 있습니다.

그 HTML 엔티티와 가 붙은 엔티티(HTML 엔티티 등를할 수 있다는 &amp;amp;그리고.&203;) 및 코멘트는 교환을 차단합니다.

Code Project 관련 기사를 읽어주세요.

감사해요.

Html Agility Pack을 사용할 수 없는 사용자를 위해, 을 참조하십시오.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;
    }
string result = Regex.Replace(anytext, @"<(.|\n)*?>", string.Empty);

여기서 제안하는 Regex 기반 솔루션을 살펴보았는데, 가장 사소한 경우를 제외하고는 어떤 자신감도 얻을 수 없습니다.속성 내의 꺾쇠 괄호만 있으면 끊을 수 있습니다.야생 HTML의 잘못된 형식은 말할 것도 없습니다.그리고 이런 엔티티는요?&amp;HTML을 일반 텍스트로 변환하려면 엔티티도 디코딩해야 합니다.

그래서 저는 아래의 방법을 제안합니다.

이 확장 메서드는 Html Agility Pack을 사용하여 HTML fragment에서 모든 HTML 태그를 효율적으로 제거합니다.또한 다음과 같은 HTML 엔티티를 디코딩합니다.&amp;. 각 텍스트 항목 사이에 새 행을 포함하여 내부 텍스트 항목만 반환합니다.

public static string RemoveHtmlTags(this string html)
{
        if (String.IsNullOrEmpty(html))
            return html;

        var doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(html);

        if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
        {
            return WebUtility.HtmlDecode(html);
        }

        var sb = new StringBuilder();

        var i = 0;

        foreach (var node in doc.DocumentNode.ChildNodes)
        {
            var text = node.InnerText.SafeTrim();

            if (!String.IsNullOrEmpty(text))
            {
                sb.Append(text);

                if (i < doc.DocumentNode.ChildNodes.Count - 1)
                {
                    sb.Append(Environment.NewLine);
                }
            }

            i++;
        }

        var result = sb.ToString();

        return WebUtility.HtmlDecode(result);
}

public static string SafeTrim(this string str)
{
    if (str == null)
        return null;

    return str.Trim();
}

만약 당신이 정말로 진지하다면, 당신은 특정 HTML 태그의 내용도 무시하고 싶을 것이다.<script>,<style>,<svg>,<head>,<object>생각난다!) 왜냐하면 우리가 추구하는 의미에서는 읽을 수 있는 콘텐츠가 포함되어 있지 않을 수 있기 때문입니다.여기서 수행하는 작업은 사용자의 상황과 원하는 정도에 따라 다르지만 HtmlAgilityPack을 사용하면 선택한 태그를 화이트리스트 또는 블랙리스트에 올리는 것은 매우 간단합니다.

컨텐츠를 HTML 페이지로 되돌리는 경우는, XSS 의 취약성과 그것을 방지하는 방법을 이해해 주세요.즉, HTML 페이지로 되돌리는 모든 사용자 입력 텍스트를 항상 인코딩합니다( ).>된다&gt;기타)

Michael Tiptop의 솔루션이 작동하지 않는다고 불평하는 사람들을 위해 .Net4+의 방법을 소개합니다.

public static string StripTags(this string markup)
{
    try
    {
        StringReader sr = new StringReader(markup);
        XPathDocument doc;
        using (XmlReader xr = XmlReader.Create(sr,
                           new XmlReaderSettings()
                           {
                               ConformanceLevel = ConformanceLevel.Fragment
                               // for multiple roots
                           }))
        {
            doc = new XPathDocument(xr);
        }

        return doc.CreateNavigator().Value; // .Value is similar to .InnerText of  
                                           //  XmlDocument or JavaScript's innerText
    }
    catch
    {
        return string.Empty;
    }
}
using System.Text.RegularExpressions;

string str = Regex.Replace(HttpUtility.HtmlDecode(HTMLString), "<.*?>", string.Empty);

HtmlAgilityPack을 대체하는 AngleSharp에서도 이 작업을 수행할 수 있습니다(HAP이 나쁜 것은 아닙니다).HTML 소스에서 텍스트를 꺼내는 것은 HAP보다 사용하기 쉽습니다.

var parser = new HtmlParser();
var htmlDocument = parser.ParseDocument(source);
var text = htmlDocument.Body.Text();

HAP보다 우수하다는 것을 증명하는 주요 기능 섹션을 볼 수 있습니다.대부분의 경우, 현재의 질문에는 과잉이라고 생각되지만, 여전히 흥미로운 대안입니다.

두 번째 파라미터, 즉 일부 태그를 유지하는 경우 HTMLagilityPack을 사용하여 다음과 같은 코드가 필요할 수 있습니다.

public string StripTags(HtmlNode documentNode, IList keepTags)
{
    var result = new StringBuilder();
        foreach (var childNode in documentNode.ChildNodes)
        {
            if (childNode.Name.ToLower() == "#text")
            {
                result.Append(childNode.InnerText);
            }
            else
            {
                if (!keepTags.Contains(childNode.Name.ToLower()))
                {
                    result.Append(StripTags(childNode, keepTags));
                }
                else
                {
                    result.Append(childNode.OuterHtml.Replace(childNode.InnerHtml, StripTags(childNode, keepTags)));
                }
            }
        }
        return result.ToString();
    }

상세한 것에 대하여는, http://nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/ 를 참조해 주세요.

'만들기'를 사용하세요.string.StripHTML();

언급URL : https://stackoverflow.com/questions/785715/how-can-i-strip-html-tags-from-a-string-in-asp-net

반응형