题 从字符串中删除HTML标记,包括C#中的


如何删除所有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>"

75
2017-10-22 16:56


起源


不要使用正则表达式,请查看HTML Agility Pack。 stackoverflow.com/questions/846994/how-to-use-html-agility-pack - Tim
谢谢Tim,但是应用程序非常庞大且完好无损,添加或下载html敏捷包无法正常工作。 - rampuriyaaa


答案:


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

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

理想情况下,您应该通过正则表达式过滤器进行另一次传递,该过滤器将处理多个空格

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

177
2017-10-22 17:08



我还没有像我需要的那样对它进行测试,但它比我预期的更好用。我将发布下面写的方法。 - Don Rolling
懒惰的比赛(<[^>]+?> 根据@David S.)可能会让这更快一点,但只是在实际项目中使用此解决方案 - 非常高兴+1 :) - Gone Coding
Regex.Replace(inputHTML,@“<[^>] +> |&nbsp | \ n;”,“”)。Trim(); \ n没有被删除 - Mahesh Malpani
我建议使用空格而不是空字符串,我们会以任何方式捕捉额外的空格 Regex.Replace(inputHTML, @"<[^>]+>|&nbsp;", " ") - Tauseef
@Tauseef如果在第一个替换调用中使用空格,最终可能会留下原始输入中没有空格的空格。说你收到了 Sound<b>Cloud</b> 作为输入;你最终会得到 Sound Cloud 虽然它应该被剥夺了 SoundCloud 因为它是如何在HTML中显示的。 - Ravi Thapliyal


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

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

29
2017-07-31 14:50





我一直在使用这个功能。删除几乎任何凌乱的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();
        }

14
2017-10-22 17:14



只是为了确认:SingleSpacedTrim()函数与字符串noHTMLNormalised = Regex.Replace(noHTML,@“\ s {2,}”,“”)执行相同的操作;来自Ravi Thapliyal的回答? - Jimmy
@Jimmy据我所知,正则表达式不会捕获单个标签或新行,如SingleSpacedTrim()。这可能是一个理想的效果,在这种情况下,只需根据需要删除案例。 - David S.
很好,但它似乎用空格替换单引号和双引号,虽然它们不在“notOkCharacter“列表,或者我在那里遗漏了什么?解码/编码会议的这一部分在开始时被调用了吗?保持这些字符的完整性是什么? - vm370


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

3
2018-06-11 06:27





这个:

(<.+?> | &nbsp;)

将匹配任何标签或 &nbsp;

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

然后x = hello


0
2017-10-22 17:08





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


0
2018-05-16 06:54





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


-1
2018-01-04 19:54





(<([^>]+)>|&nbsp;)

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


-1
2018-02-10 17:58