Как использовать регулярное выражение C # для замены / удаления всех тегов HTML, включая угловые скобки? Может кто-нибудь помочь мне с кодом?
Как использовать регулярное выражение C # для замены / удаления всех тегов HTML, включая угловые скобки? Может кто-нибудь помочь мне с кодом?
Ответы:
Как часто говорилось ранее, вы не должны использовать регулярные выражения для обработки документов XML или HTML. Они не очень хорошо работают с документами HTML и XML, потому что нет способа выразить вложенные структуры в общем виде.
Вы можете использовать следующее.
String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);
Это будет работать в большинстве случаев, но будут случаи (например, CDATA, содержащий угловые скобки), когда это не будет работать должным образом.
Правильный ответ - не делайте этого, используйте HTML Agility Pack .
Отредактировано для добавления:
Чтобы бессовестно украсть комментарий Джесси ниже и избежать обвинений в неадекватном ответе на вопрос по прошествии всего этого времени, вот простой и надежный фрагмент с использованием пакета 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.
Вопрос слишком широкий, чтобы на него можно было дать однозначный ответ. Вы говорите об удалении всех тегов из реального HTML-документа, например веб-страницы? Если это так, вам необходимо:
Это просто не в моей голове - я уверен, что это еще не все. После того, как вы все это сделаете, в некоторых местах вы получите слова, предложения и абзацы, соединенные вместе, а в других - большие куски бесполезного пробела.
Но, если вы работаете только с фрагментом и можете просто удалить все теги, вот регулярное выражение, которое я бы использовал:
@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"
Сопоставление строк в одинарных и двойных кавычках в их собственных альтернативах достаточно для решения проблемы угловых скобок в значениях атрибутов. Я не вижу необходимости явно сопоставлять имена атрибутов и другие вещи внутри тега, как это делает регулярное выражение в ответе Райана; первая альтернатива обрабатывает все это.
Если вас интересуют эти (?>...)
конструкции, они атомные группы . Они делают регулярное выражение немного более эффективным, но, что более важно, предотвращают неконтролируемый откат назад, на что всегда следует обращать внимание, когда вы смешиваете чередование и вложенные квантификаторы, как это сделал я. Я действительно не думаю, что это будет проблемой здесь, но я знаю, что если я не упомяну об этом, это сделает кто-то другой. ;-)
Это регулярное выражение, конечно, не идеально, но оно, вероятно, настолько хорошо, насколько вам когда-либо понадобится.
Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline);
@JasonTrue правильно, что удаление тегов HTML не должно выполняться с помощью регулярных выражений.
Убрать HTML-теги с помощью HtmlAgilityPack довольно просто:
public string StripTags(string input) {
var doc = new HtmlDocument();
doc.LoadHtml(input ?? "");
return doc.DocumentNode.InnerText;
}
Я хотел бы повторить ответ Джейсона, хотя иногда вам нужно наивно разобрать какой-то 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"
}
<xml>.*(?!</xml>)</xml>
с RegexOptions.SingleLine
модификатором для первых двух и <[^>]*>
для последнего. Первые также могут быть объединены путем захваченного чередования имени первого тега и обратных ссылок на него в отрицательном прогнозе и конечном теге.
попробуйте метод регулярного выражения по этому 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);
}
Добавить .+?
в <[^>]*>
и попробовать это регулярное выражение (основание на это ):
<[^>].+?>
Используйте этот метод для удаления тегов:
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, ""));
}