Как использовать регулярное выражение С# для замены/удаления всех тегов 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+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"
Ответ 9
Добавьте .+?
в <[^>]*>
и попробуйте это регулярное выражение (база на this):
<[^>].+?>
Ответ 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, ""));
}