Использование регулярных выражений С# для удаления тегов HTML

Как использовать регулярное выражение С# для замены/удаления всех тегов HTML, включая угловые скобки? Может кто-нибудь, пожалуйста, помогите мне с кодом?

Ответ 1

Как часто указывалось ранее, вы не должны использовать регулярные выражения для обработки документов XML или HTML. Они не очень хорошо работают с документами HTML и XML, потому что нет способа выразить вложенные структуры в общем виде.

Вы можете использовать следующее.

String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);

Это будет работать в большинстве случаев, но будут случаи (например, CDATA, содержащие угловые скобки), где это не будет работать, как ожидалось.

Ответ 2

Правильный ответ не делает этого, используйте HTML Agility Pack.

Отредактировано для добавления:

Чтобы бесстыдно украсть комментарий, указанный jesse, и чтобы не быть обвиненным в неадекватном ответе на вопрос после всего этого времени, вот простой, надежный фрагмент, использующий HTML Agility Pack, который работает с даже наиболее несовершенными, капризными битами 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-хакерству.

Ответ 3

Вопрос слишком широк, чтобы ответить окончательно. Вы говорите об удалении всех тегов из реального HTML-документа, например веб-страницы? Если это так, вам придется:

  • удалите объявление <! DOCTYPE или пролог
  • удалить все комментарии SGML
  • удалить весь элемент HEAD
  • удалить все элементы SCRIPT и STYLE
  • do Grabthar-знает-что с элементами FORM и TABLE
  • удалить остальные теги
  • удалите <! [CDATA [и]] > последовательности из разделов CDATA, но оставляют только их содержимое.

Это как раз у меня в голове - я уверен, что там больше. Как только вы это сделаете, вы получите слова, предложения и параграфы, которые будут встречаться в некоторых местах, и большие куски бесполезных пробелов в других.

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

@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"

Совпадение строк с одним и двумя кавычками в их собственных альтернативах достаточно для решения проблемы угловых скобок в значениях атрибутов. Я не вижу необходимости явно сопоставлять имена атрибутов и другие вещи внутри тега, например, регулярное выражение в ответе Райана; первая альтернатива обрабатывает все это.

Если вам интересно об этих конструкциях (?>...), они атомные группы. Они делают регулярное выражение немного более эффективным, но, что более важно, они предотвращают обратное отслеживание, которое вы должны всегда следить за тем, когда вы смешиваете чередование и вложенные кванторы, как я это делал. Я действительно не думаю, что это будет проблемой здесь, но я знаю, если я не буду упоминать об этом, кто-то другой.; -)

Это регулярное выражение не является совершенным, конечно, но оно, вероятно, так хорошо, как вам когда-либо понадобится.

Ответ 4

Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline);

Источник

Ответ 5

@JasonTrue правильно, что удаление HTML-тегов не должно выполняться с помощью регулярных выражений.

Это довольно просто снять теги HTML с помощью HtmlAgilityPack:

public string StripTags(string input) {
    var doc = new HtmlDocument();
    doc.LoadHtml(input ?? "");
    return doc.DocumentNode.InnerText;
}

Ответ 6

Я хотел бы повторить ответ Джейсона, хотя иногда вам нужно наивно разбирать какой-то Html и вытаскивать текст.

Мне нужно было сделать это с помощью некоторого 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"
    }

Ответ 7

попробуйте метод регулярных выражений по этому 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);
}

Ответ 8

используйте это.

@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"

Ответ 10

Используйте этот метод для удаления тегов:

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, ""));
}