从C#中的字符串中删除HTML标记和注释?

从C#中的字符串中删除HTML标记和注释?,c#,html,regex,C#,Html,Regex,如何从C#中的字符串中删除以“开头的所有内容。我知道可以用regex来完成,但我不太擅长。我最近为一个小项目快速编写的标记模式就是这个 string tagPattern = @"<[!--\W*?]*?[/]*?\w+.*?>"; 它可能需要修改以正确处理脚本或样式标记。非正则表达式选项:但它仍然不会解析嵌套标记 public static string StripHTML(string line) { int finished = 0;

如何从C#中的字符串中删除以“开头的所有内容。我知道可以用regex来完成,但我不太擅长。

我最近为一个小项目快速编写的标记模式就是这个

string tagPattern = @"<[!--\W*?]*?[/]*?\w+.*?>";

它可能需要修改以正确处理脚本或样式标记。

非正则表达式选项:但它仍然不会解析嵌套标记

public static string StripHTML(string line)
        {
            int finished = 0;
            int beginStrip;
            int endStrip;

            finished = line.IndexOf('<');
            while (finished != -1)
            {
                beginStrip = line.IndexOf('<');
                endStrip = line.IndexOf('>', beginStrip + 1);
                line = line.Remove(beginStrip, (endStrip + 1) - beginStrip);
                finished = line.IndexOf('<');
            } 

            return line;
        }
公共静态字符串StripHTML(字符串行)
{
int=0;
int beginStrip;
内端条;

finished=line.IndexOf('另一个比正则表达式快8倍的非正则表达式代码:

public static string StripTagsCharArray(string source)
{
    char[] array = new char[source.Length];
    int arrayIndex = 0;
    bool inside = false;
    for (int i = 0; i < source.Length; i++)
    {
        char let = source[i];
        if (let == '<')
        {
            inside = true;
            continue;
        }
        if (let == '>')
        {
            inside = false;
            continue;
        }
        if (!inside)
        {
            array[arrayIndex] = let;
            arrayIndex++;
        }
    }
    return new string(array, 0, arrayIndex);
}
公共静态字符串stripTagScharray(字符串源)
{
char[]数组=新字符[source.Length];
int-arrayIndex=0;
bool-inside=false;
for(int i=0;i
使用html Agility Pack之类的html解析器。对于html来说,正则表达式通常是一个糟糕的选择。在这种情况下,您可以,因为它是正则表达式的简单用例。它与为不同的标记解析整个DOM不同
[!--\W*?]
意味着“匹配介于
-
之间的字符、非单词字符、
*
”。由于该组是可选的,因此不会造成伤害,但它不能实现明显的预期目的,即“消极前瞻”(即
(?!-)
\W*?
和下面的
*?
没有任何意义)。
public static string StripTagsCharArray(string source)
{
    char[] array = new char[source.Length];
    int arrayIndex = 0;
    bool inside = false;
    for (int i = 0; i < source.Length; i++)
    {
        char let = source[i];
        if (let == '<')
        {
            inside = true;
            continue;
        }
        if (let == '>')
        {
            inside = false;
            continue;
        }
        if (!inside)
        {
            array[arrayIndex] = let;
            arrayIndex++;
        }
    }
    return new string(array, 0, arrayIndex);
}