0

基本的に、htmlタグを他のタグに置き換えたい、例えば:

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

最初に、私が使用した

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

このメソッドの問題は、すべてのケースを管理する必要があり、ジェネリック クラスが必要なことです。たとえば、このメソッドは次のタグのコンテンツでは使用できません。

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

どうすればこれを解決できますか?

編集:タグにどの属性が含まれているかを事前に知らないことに注意してください。"p","/p", "br", "b", ... を含むタグを置き換えたい

4

4 に答える 4

1

おそらく、HTML Agility Pack ( http://htmlagilitypack.codeplex.com/ )を使用できます。

NuGet経由で取得でき、xPathを使用してhtmlDocからノードのリストを取得できます...次に、これらのリストをループして、各ノードに処理を実行できます...

于 2013-02-08T08:26:04.397 に答える
0

以前のプロジェクトの 1 つを調べたところ、似たようなことがありました。

私が使ってきたこの方法を見てください:

    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/>");

于 2013-02-08T08:26:38.323 に答える
0

この問題を解決するには、正規表現を使用する必要があります。詳細については、このサイトを参照してください。大文字と小文字を区別する/区別しない一致のオプションが表示されます。

于 2013-02-08T08:23:16.507 に答える
0

いくつかの単純な文字列操作を試すことができます。追加の名前空間やツールは含まれていません。

この例を参照してください。問題が解決する可能性があります。

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ステートメントではなく 1 回実行するだけで改善できるかもしれません。また、悪いタグをチェックしませんでした。コードは 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);
于 2013-02-08T08:54:31.843 に答える