ASP.NET을 사용하여 어떻게 주어진 문자열에서 HTML 태그를 안정적으로 제거 할 수 있습니까 (예 : 정규식을 사용하지 않음)? PHP와 같은 것을 찾고 strip_tags
있습니다.
예:
<ul><li>Hello</li></ul>
산출:
“여보세요”
나는 바퀴를 재발 명하지 않으려 고 노력하고 있지만 지금까지 내 요구를 충족시키는 것을 찾지 못했습니다.
답변
문자열에서 모든 HTML 태그를 제거 하는 경우 정규식에서도 안정적 으로 작동 합니다. 바꾸다:
<[^>]*(>|$)
전역 적으로 빈 문자열로. 나중에 문자열을 정규화하는 것을 잊지 마십시오.
[\s\r\n]+
단일 공간으로 결과를 트리밍합니다. 선택적으로 HTML 문자 엔티티를 실제 문자로 다시 바꿉니다.
참고 :
- 제한이 있습니다. HTML 및 XML
>
은 속성 값을 허용 합니다. 이 솔루션 은 이러한 값이 발생하면 깨진 마크 업 을 반환합니다. - 솔루션은 다음과 같이 기술적으로 안전합니다. 결과에는 사이트 간 스크립팅을 수행하거나 페이지 레이아웃을 깨는 데 사용할 수있는 내용이 포함되지 않습니다. 그것은 매우 깨끗하지 않습니다.
- 모든 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;
와 &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;
}