ASP 문자열에서 HTML 태그를 삭제하려면 어떻게 해야 합니까?인터넷?
ASP " . 해야 합니까(NET, 특정 문자열에서 HTML 태그를 확실하게 제거하려면(regex를 사용하지 않음) 어떻게 해야 합니까?PHP를 .strip_tags
.
예:
<ul><li>Hello</li></ul>
출력:
"안녕하세요"
바퀴를 다시 만들지 않으려고 노력하고 있지만, 지금까지 제 요구에 맞는 것을 찾지 못했습니다.
문자열에서 HTML 태그를 모두 삭제하는 경우 regex에서도 안정적으로 동작합니다.대체:
<[^>]*(>|$)
빈 문자열을 글로벌하게 사용합니다.그 후 스트링을 정규화하는 것을 잊지 말고 다음 항목을 치환해 주십시오.
[\s\r\n]+
한 칸의 공백으로 결과를 트리밍합니다.임의로 HTML 문자 엔티티를 실제 문자로 바꿉니다.
주의:
- 은 「HTML」을 허가합니다. HTML 'XML"
>
Atribute 값으로 지정합니다.이 솔루션은 이러한 값이 발견되면 깨진 마크업을 반환합니다. - 솔루션은 다음과 같이 기술적으로 안전합니다.이 결과에는 사이트 간 스크립팅을 수행하거나 페이지 레이아웃을 깨는 데 사용할 수 있는 항목이 포함되지 않습니다.그것은 단지 매우 깨끗하지 않을 뿐이다.
- 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;
그리고.&203;
) 및 코멘트는 교환을 차단합니다.
감사해요.
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의 잘못된 형식은 말할 것도 없습니다.그리고 이런 엔티티는요?&
HTML을 일반 텍스트로 변환하려면 엔티티도 디코딩해야 합니다.
그래서 저는 아래의 방법을 제안합니다.
이 확장 메서드는 Html Agility Pack을 사용하여 HTML fragment에서 모든 HTML 태그를 효율적으로 제거합니다.또한 다음과 같은 HTML 엔티티를 디코딩합니다.&
. 각 텍스트 항목 사이에 새 행을 포함하여 내부 텍스트 항목만 반환합니다.
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 페이지로 되돌리는 모든 사용자 입력 텍스트를 항상 인코딩합니다( ).>
된다>
기타)
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
'programing' 카테고리의 다른 글
Safari의 Swift Open 링크 (0) | 2023.04.20 |
---|---|
C#을 사용하여 Excel에서 셀 색상 변경 (0) | 2023.04.20 |
어떤 iOS 버전이 실행 중인지 프로그래밍 방식으로 감지하려면 어떻게 해야 합니까? (0) | 2023.04.20 |
Asp.NET Web API - 405 - 이 페이지에 액세스하는 데 사용되는 HTTP 동사는 허용되지 않습니다 - 핸들러 매핑 설정 방법 (0) | 2023.04.20 |
WPF 데이터 그리드의 날짜 형식 (0) | 2023.04.20 |