用C#中的其他标记替换html标记和属性

时间:2013-02-08 08:18:35

标签: c# replace tags html

基本上,我想用其他标签替换html标签,例如:

</br> --> <LineBreak/>
<p> --> <Paragraph>

一开始,我用

convertedHtml = html.replace("</br>","<LineBreak/>");

这种方法的问题是需要管理所有案例,我想要一个泛型类。例如,此标记内容无法使用此方法:

<p class="foo"> --> <Paragraph>
<p id="bar"> --> <Paragraph>
.....

我该如何解决这个问题?

编辑:注意我事先并不知道标签中有哪些属性。我想要包含“p”,“/ p”,“br”,“b”,...

的替换标签

4 个答案:

答案 0 :(得分:1)

也许您可以使用HTML Agility Pack(http://htmlagilitypack.codeplex.com/

您可以通过NuGet获取它,它允许您使用xPath从htmlDoc获取节点列表...然后您可以遍历这些列表并对每个节点执行操作...

答案 1 :(得分:0)

您应该使用正则表达式来解决此问题。有关更多信息,请访问this site。它将为您提供区分大小写/不敏感匹配的选项。

答案 2 :(得分:0)

我查看了一个较旧的项目,在那里我做了类似的事情。

看看我一直在使用的这种方法:

    private static Regex _validAttributeOrTagNameRegEx = 
                       new Regex(@"^\w+$", RegexOptions.Compiled |RegexOptions.IgnoreCase);
        private const string STR_RemoveHtmlAttributeRegex = 
                           @"(?<=<)([^/>]+)(\s{0}=['""][^'""]+?['""])([^/>]*)(?=/?>|\s)";
    public static string RemoveHtmlAttribute(this string input, string attributeName) {
       if (_validAttributeOrTagNameRegEx.IsMatch(attributeName)) {
          Regex reg = new Regex(string.Format(STR_RemoveHtmlAttributeRegex, attributeName),
             RegexOptions.IgnoreCase);
          return reg.Replace(input, item => item.Groups[1].Value + item.Groups[3].Value);
       } else {
          throw new ArgumentException("Not a valid HTML attribute name", "attributeName");
       }
    }

我不确定这是否符合您的要求,但它可能是如何解决它的想法。从html标签中删除属性后,您可以使用旧方法convertedHtml = html.replace("</br>","<LineBreak/>");

答案 3 :(得分:0)

你可以尝试一些简单的字符串操作,不包括额外的namaspaces和工具:

请参阅此示例,也许它可以解决您的问题:

string html = string.Concat("<p class=\"foo\">", 
                             "<p class=\"bar\">",
                             "<p>",
                             "</br>",
                             "<P>",
                             "</BR>"); // tags can be upper case as well

string strAux = html;
int tagOpenedAt=-1, tagClosedAt=-1;
bool isError = false;

do
{
   tagOpenedAt = strAux.IndexOf('<');
   tagClosedAt = strAux.IndexOf('>');
   if(tagOpenedAt<tagClosedAt)
   {
       string fullTag = strAux.Substring(tagOpenedAt, tagClosedAt - tagOpenedAt + 1);

       //<p> --> <Paragraph>
       if (fullTag.ToLower().Equals("<p>") || fullTag.ToLower().StartsWith("<p ")) 
           html = html.Replace(fullTag, "<Paragraph>");

       //</br> --> <LineBreak/>
       if (fullTag.ToLower().Equals("</br>")) 
           html = html.Replace(fullTag, "<LineBreak/>");

       //more if conditions as you need them

       strAux = strAux.Substring(tagClosedAt + 1);
   }
   else
   {
       isError = true;
   }
} 
while (tagOpenedAt>-1 && tagClosedAt>-1 && !isError);

很抱歉代码不好,也许您可​​以通过简单地执行 .ToLower()一次而不是每次 if 语句来改进。另外,我没有检查错误的标签,代码只是假设html是有效的。

只是编辑了一个位

       string html = string.Concat("<p class=\"foo\">","\n",
                                    "<p class=\"bar\">", "\n",
                                    "<p>", "\n",
                                    "</br>", "\n",
                                    "<P>", "\n",
                                    "</BR>");

        Console.WriteLine("HTML is :\n{0}\n", html);

        string strAux = html;
        int tagOpenedAt=-1, tagClosedAt=-1;
        bool isError = false;

        do
        {
            tagOpenedAt = strAux.IndexOf('<');
            tagClosedAt = strAux.IndexOf('>');
            if(tagOpenedAt < tagClosedAt)
            {
                string _fullTag = strAux.Substring(tagOpenedAt, tagClosedAt - tagOpenedAt + 1);
                string _lower = _fullTag.ToLower();
                string _replace = null;

                //<p> --> <Paragraph>
                if (_lower.Equals("<p>") || _lower.StartsWith("<p "))
                    _replace = "<Paragraph>";

                //</br> --> <LineBreak/>
                if (_lower.Equals("</br>")) 
                    _replace = "<LineBreak/>";

                //more if conditions as you need them

                if(_replace != null)
                {
                    html = html.Replace(_fullTag, _replace);
                    Console.WriteLine("Replaced {0} with {1}", _fullTag, _replace);
                }

                strAux = strAux.Substring(tagClosedAt + 1);
            }
            else
            {
                isError = true;
            }
        } 
        while (tagOpenedAt>-1 && tagClosedAt>-1 && !isError);

    Console.WriteLine("\nNew html is :\n{0}",html);