Удалите теги HTML из строки, включая   в С#
Как удалить все теги 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> </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>"
Ответы
Ответ 1
Если вы не можете использовать ориентированное на парсер HTML решение для фильтрации тегов, здесь простое регулярное выражение.
string noHTML = Regex.Replace(inputHTML, @"<[^>]+>| ", "").Trim();
В идеале вы должны сделать еще один проход через фильтр регулярных выражений, который будет обслуживать несколько пробелов, как
string noHTMLNormalised = Regex.Replace(noHTML, @"\s{2,}", " ");
Ответ 2
Я взял код @Ravi Thapliyal и сделал метод: он прост и может не очищать все, но до сих пор он делает то, что мне нужно.
public static string ScrubHtml(string value) {
var step1 = Regex.Replace(value, @"<[^>]+>| ", "").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, @"<[^>]*(>|$)| |‌|»|«", string.Empty).Trim();
Ответ 5
(<.+?> | )
будет соответствовать любому тегу или
string regex = @"(<.+?>| )";
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, @" ", " ");
var step3 = Regex.Replace(step2, @"\s{2,}", " ");
return step3;
}
Использовал & nbps без точки с запятой, потому что он был отформатирован переполнением стека.
Ответ 9
(<([^>]+)>| )
Вы можете проверить это здесь:
https://regex101.com/r/kB0rQ4/1