Подтвердить что ты не робот

Удалите теги HTML из строки, включая &nbsp в С#

Как удалить все теги HTML, включая & nbsp, с помощью regex в С#. Моя строка выглядит как

  "<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>"
4b9b3361

Ответ 1

Если вы не можете использовать ориентированное на парсер HTML решение для фильтрации тегов, здесь простое регулярное выражение.

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

В идеале вы должны сделать еще один проход через фильтр регулярных выражений, который будет обслуживать несколько пробелов, как

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

Ответ 2

Я взял код @Ravi Thapliyal и сделал метод: он прост и может не очищать все, но до сих пор он делает то, что мне нужно.

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

Ответ 3

Я использовал эту функцию некоторое время. Удаляет почти любой беспорядочный 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();
        }

Ответ 4

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

Ответ 5

(<.+?> | &nbsp;)

будет соответствовать любому тегу или &nbsp;

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

то x = hello

Ответ 6

Санирование документа Html связано с множеством сложных вещей. Этот пакет может помочь: https://github.com/mganss/HtmlSanitizer

Ответ 7

HTML в своей основной форме просто XML. Вы можете проанализировать ваш текст в объекте XmlDocument, а в корневом элементе вызвать InnerText для извлечения текста. Это удалит все HTML-теги в любой форме, а также будет работать со специальными символами, такими как & lt; & NBSP; все за один раз.

Ответ 8

Я использовал код @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 без точки с запятой, потому что он был отформатирован переполнением стека.