如何在不使用C#关闭>的情况下修复open<'s?

时间:2014-10-26 03:25:59

标签: c# html regex parsing

我正在使用C#和HTML Agility Pack的.NEt 4.5版本。我必须能够导入大量不同的html文档,并始终能够将它们加载到.NET XmlDocument中。

我目前的问题是我看到类似的HTML:

<p class="s18">(4)   if qual. ch ild <17 f or</p>  

我需要转换那个&#34;&lt;&#34;其他任何事情,但我需要保留所有其他&lt;&s;和&gt;&#39; s。我希望尽可能少地使用代码行,并希望有人能告诉我如何利用Html Agility Pack(已经在我的项目中用于其他事情)来解决这个问题。

编辑:如果Html Agility Pack不能满足需要,那么我会欣赏一种C#方法,它会在保留任何有效标签的同时消除或关闭任何打开的标志。

编辑2:删除,不再相关。

编辑3:我已经部分解决了这个问题,但是有一个错误,我很感激帮助解决。

我的方法如下。此方法成功删除了&#39;&#39;和&#39;&gt;&#39;此HTML中的字符。

<p>yo hi</p><p> Gee I love 1<'s</p><td name=\"\" /><p>bazinga ></p>  

我遇到的问题是Regex.Matches()方法似乎实际上找不到所有匹配项。它将找到一个匹配,然后查找下一场比赛,在第一场比赛结束后定位。这种行为使得&#34;我喜欢2&#34; &#39;&LT;&#39;在以下HTML中跳过字符。

<p>yo hi</p><p> Gee I love 1<'s<p> Gee I love 2<'s<p> Gee I love 3<'s</p></p></p><td name=\"\" /><p>bazinga ></p>  

在我看来&#34;我喜欢2&#34;应该是匹配,但Regex.Matches()方法正在跳过它,因为我认为,位置位置被向前移动到最后一场比赛的结尾。

private static string RemovePartialTags(string input)
    {
        Regex regex = new Regex(@"<[^<>/]+>(.*?)<[^<>]+>");
        string output = regex.Replace(input, delegate(Match m)
                {
                    string v = m.Value;

                    Regex reg = new Regex(@"<[^<>]+>");
                    MatchCollection matches = reg.Matches(v);
                    int locEndTag = v.IndexOf(matches[1].Value);

                    List<string> tokens = new List<string>
                            {
                                v.Substring(0, matches[0].Length),

                                v.Substring(matches[0].Length, locEndTag - matches[0].Length)
                                    .Replace(@"<", string.Empty)
                                    .Replace(@">", string.Empty)
                            };
                    tokens.Add(v.Substring(tokens[0].Length + (locEndTag - matches[0].Length)));

                    return tokens[0] + tokens[1] + tokens[2];
                }
            );

        return output;
    }  

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我通过使用与上面相同的方法但使用修改的正则表达式

解决了我的问题
@"<[^<>/]+>(.*?)[<](.*?)<[^<>]+>" 

方法:

private static string RemovePartialTags(string input)
    {
        Regex regex = new Regex(@"<[^<>/]+>(.*?)[<](.*?)<[^<>]+>");
        string output = regex.Replace(input, delegate(Match m)
                {
                    string v = m.Value;

                    Regex reg = new Regex(@"<[^<>]+>");
                    MatchCollection matches = reg.Matches(v);
                    int locEndTag = v.IndexOf(matches[1].Value);

                    List<string> tokens = new List<string>
                            {
                                v.Substring(0, matches[0].Length),

                                v.Substring(matches[0].Length, locEndTag - matches[0].Length)
                                    .Replace(@"<", string.Empty)
                                    .Replace(@">", string.Empty)
                            };
                    tokens.Add(v.Substring(tokens[0].Length + (locEndTag - matches[0].Length)));

                    return tokens[0] + tokens[1] + tokens[2];
                }
            );

        return output;
    }