使用C#正则表达式删除HTML标记

时间:2009-04-25 00:23:11

标签: c# html regex parsing

如何使用C#正则表达式替换/删除所有HTML标记,包括尖括号? 有人可以帮我提供代码吗?

10 个答案:

答案 0 :(得分:146)

如前所述,您不应使用正则表达式来处理XML或HTML文档。它们在HTML和XML文档中表现不佳,因为无法以一般方式表达嵌套结构。

您可以使用以下内容。

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

这适用于大多数情况,但会有一些情况(例如CDATA包含尖括号),这将无法正常工作。

答案 1 :(得分:78)

正确答案是不要这样做,请使用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 hackery。

答案 2 :(得分:37)

问题太广泛,无法明确回答。您是在谈论从真实HTML文档中删除所有标记,例如网页?如果是这样,你必须:

  • 删除&lt;!DOCTYPE声明或&lt;?xml prolog(如果存在)
  • 删除所有SGML评论
  • 删除整个HEAD元素
  • 删除所有SCRIPT和STYLE元素
  • 使用FORM和TABLE元素做Grabthar知道什么
  • 删除剩余的代码
  • 删除&lt;![CDATA [和]]&gt;来自CDATA部分的序列,但保留其内容

这只是我的头脑 - 我相信还有更多。一旦你完成了所有这些,你最终会在某些地方一起运行单词,句子和段落,而在其他地方运行大块无用的空白。

但是,假设你正在处理一个片段而你只需删除所有标签就可以了,这里是我要使用的正则表达式:

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

在他们自己的替代方案中匹配单引号和双引号字符串足以处理属性值中的尖括号问题。我没有看到任何需要明确匹配标签内的属性名称和其他内容,如Ryan的答案中的正则表达式;第一个替代方案处理所有这些。

如果您对这些(?>...)构造感到奇怪,那么它们就是atomic groups。它们使正则表达式更有效率,但更重要的是,它们可以防止失控的回溯,这是你应该经常注意的,当你混合使用交替和嵌套量词时,就像我一样。我真的不认为这会是一个问题,但我知道如果我不提它,别人会。 ; - )

当然,这个正则表达式并不完美,但它可能就像你需要的一样好。

答案 3 :(得分:25)

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

Source

答案 4 :(得分:16)

@JasonTrue是正确的,剥离HTML标签不应该通过正则表达式完成。

使用HtmlAgilityPack剥离HTML标记非常简单:

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

答案 5 :(得分:13)

我想回应Jason的回应,虽然有时你需要天真地解析一些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"
    }

答案 6 :(得分:5)

在此网址尝试正则表达式方法: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);
}

答案 7 :(得分:3)

使用此.. ..

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

答案 8 :(得分:2)

.+?中添加<[^>]*>并试用此正则表达式(基于this):

<[^>].+?>

c# .net regex demo enter image description here

答案 9 :(得分:-1)

使用此方法删除标记:

myCString(const char* strParam)
相关问题