从包含在C#中的字符串中删除HTML标记

时间:2013-10-22 16:56:01

标签: c# html regex string

如何删除所有HTML标记,包括在C#中使用正则表达式。我的字符串看起来像

  "<div>hello</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>"

9 个答案:

答案 0 :(得分:186)

如果您不能使用面向HTML解析器的解决方案来过滤掉标签,那么这里就是一个简单的正则表达式。

string noHTML = Regex.Replace(inputHTML, @"<[^>]+>|&nbsp;", "").Trim();

理想情况下,您应该再次通过正则表达式过滤器来处理多个空格

string noHTMLNormalised = Regex.Replace(noHTML, @"\s{2,}", " ");

答案 1 :(得分:30)

我采用了@Ravi Thapliyal的代码并制定了一个方法:它很简单,可能无法清理所有内容,但到目前为止它正在做我需要做的事情。

public static string ScrubHtml(string value) {
    var step1 = Regex.Replace(value, @"<[^>]+>|&nbsp;", "").Trim();
    var step2 = Regex.Replace(step1, @"\s{2,}", " ");
    return step2;
}

答案 2 :(得分:16)

我一直在使用这个功能。删除几乎任何乱七八糟的HTML,你可以抛出它并使文本保持原样。

        private static readonly Regex _tags_ = new Regex(@"<[^>]+?>", RegexOptions.Multiline | RegexOptions.Compiled);

        //add characters that are should not be removed to this regex
        private static readonly Regex _notOkCharacter_ = new Regex(@"[^\w;&#@.:/\\?=|%!() -]", RegexOptions.Compiled);

        public static String UnHtml(String html)
        {
            html = HttpUtility.UrlDecode(html);
            html = HttpUtility.HtmlDecode(html);

            html = RemoveTag(html, "<!--", "-->");
            html = RemoveTag(html, "<script", "</script>");
            html = RemoveTag(html, "<style", "</style>");

            //replace matches of these regexes with space
            html = _tags_.Replace(html, " ");
            html = _notOkCharacter_.Replace(html, " ");
            html = SingleSpacedTrim(html);

            return html;
        }

        private static String RemoveTag(String html, String startTag, String endTag)
        {
            Boolean bAgain;
            do
            {
                bAgain = false;
                Int32 startTagPos = html.IndexOf(startTag, 0, StringComparison.CurrentCultureIgnoreCase);
                if (startTagPos < 0)
                    continue;
                Int32 endTagPos = html.IndexOf(endTag, startTagPos + 1, StringComparison.CurrentCultureIgnoreCase);
                if (endTagPos <= startTagPos)
                    continue;
                html = html.Remove(startTagPos, endTagPos - startTagPos + endTag.Length);
                bAgain = true;
            } while (bAgain);
            return html;
        }

        private static String SingleSpacedTrim(String inString)
        {
            StringBuilder sb = new StringBuilder();
            Boolean inBlanks = false;
            foreach (Char c in inString)
            {
                switch (c)
                {
                    case '\r':
                    case '\n':
                    case '\t':
                    case ' ':
                        if (!inBlanks)
                        {
                            inBlanks = true;
                            sb.Append(' ');
                        }   
                        continue;
                    default:
                        inBlanks = false;
                        sb.Append(c);
                        break;
                }
            }
            return sb.ToString().Trim();
        }

答案 3 :(得分:4)

var noHtml = Regex.Replace(inputHTML, @"<[^>]*(>|$)|&nbsp;|&zwnj;|&raquo;|&laquo;", string.Empty).Trim();

答案 4 :(得分:0)

这样:

(<.+?> | &nbsp;)

将匹配任何代码或&nbsp;

string regex = @"(<.+?>|&nbsp;)";
var x = Regex.Replace(originalString, regex, "").Trim();

然后x = hello

答案 5 :(得分:0)

清理Html文档涉及许多棘手的事情。这个包可能有帮助: https://github.com/mganss/HtmlSanitizer

答案 6 :(得分:0)

HTML的基本形式只是XML。您可以在XmlDocument对象中解析文本,并在根元素上调用InnerText来提取文本。这将删除任何形式的所有HTML tages,并处理特殊字符,如&amp; lt; &安培; NBSP;一气呵成。

答案 7 :(得分:0)

我使用了@RaviThapliyal和@Don Rolling的代码,但做了一些修改。由于我们将&nbsp替换为空字符串,而应将&nbsp替换为空格,因此添加了额外的步骤。它像魅力一样对我有效。

public static string FormatString(string value) {
    var step1 = Regex.Replace(value, @"<[^>]+>", "").Trim();
    var step2 = Regex.Replace(step1, @"&nbsp;", " ");
    var step3 = Regex.Replace(step2, @"\s{2,}", " ");
    return step3;
}

使用&nbps时不使用分号,因为它已由堆栈溢出格式化。

答案 8 :(得分:-1)

def clean(self):
    try:
        printer_profile = self.printer_profile 
    except ObjectDoesNotExist:
        pass
    else:
        ...code to validate address...

你可以在这里测试一下: https://regex101.com/r/kB0rQ4/1