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 문서에서 모든 태그를 제거하는 것에 대해 이야기하고 있습니까? 그렇다면 다음을 수행해야합니다.
그것은 내 머리 꼭대기에 있습니다. 더 많은 것이있을 것입니다. 모든 것을 마치면 어떤 곳에서는 단어, 문장 및 단락이 결합되고 다른 곳에서는 쓸모없는 공백이 생깁니다.
그러나 조각으로 만 작업하고 모든 태그를 제거하는 것으로 벗어날 수 있다고 가정하면 여기에 사용할 정규 표현식이 있습니다.
@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"
작은 따옴표와 큰 따옴표로 묶은 문자열을 다른 방법으로 일치 시키면 속성 값의 꺾쇠 괄호 문제를 해결할 수 있습니다. Ryan의 답변에있는 정규 표현식과 같이 태그 내부의 속성 이름 및 기타 항목을 명시 적으로 일치시킬 필요가 없습니다. 첫 번째 대안은이 모든 것을 처리합니다.
이러한 (?>...)
구조 에 대해 궁금한 경우 원자 그룹 입니다. 정규식을 좀 더 효율적으로 만들지 만 더 중요한 점은 런 어웨이 역 추적을 방지하는 것입니다. 나는 그것이 그것이 여기서 문제가 될 것이라고 생각하지 않지만, 그것을 언급하지 않으면 다른 누군가가 알 것입니다. ;-)
이 정규 표현식은 물론 완벽하지는 않지만 필요한만큼 좋을 것입니다.
@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"
}
<xml>.*(?!</xml>)</xml>
와 같은 것을 사용하십시오 . 첫 번째 태그는 첫 번째 태그 이름에서 캡처 된 대체와 네거티브 lookahead 및 최종 태그에서 역 참조로 결합 될 수도 있습니다. RegexOptions.SingleLine
<[^>]*>
이 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);
}
이 방법을 사용하여 태그를 제거하십시오.
public string From_To(string text, string from, string to)
{
if (text == null)
return null;
string pattern = @"" + from + ".*?" + to;
Regex rx = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
MatchCollection matches = rx.Matches(text);
return matches.Count <= 0 ? text : matches.Cast<Match>().Where(match => !string.IsNullOrEmpty(match.Value)).Aggregate(text, (current, match) => current.Replace(match.Value, ""));
}