0

大きな html エンコードされた文字列があり、ホワイトリストに登録された特定の html タグのみをデコードしたい。

c# でこれを行う方法はありますか? WebUtility.HtmlDecode() はすべてをデコードします。

`以下のテストに合格する DecodeSpecificTags() の実装を探しています。

    [Test]
    public void DecodeSpecificTags_SimpleInput_True()
    {
        string input = "<span>i am <strong color=blue>very</strong> big <br>man.</span>";
        string output = "&lt;span&gt;i am <strong color=blue>very</strong> big <br>man.&lt;/span&gt;";
        List<string> whiteList = new List<string>(){ "strong","br" } ;

        Assert.IsTrue(DecodeSpecificTags(whiteList,input) == output);
    }`
4

3 に答える 3

1

あなたはこのようなことをすることができます

public string DecodeSpecificTags(List<string> whiteListedTagNames,string encodedInput)
{
    String regex="";
    foreach(string s in whiteListedTagNames)
    {
        regex="&lt;"+@"\s*/?\s*"+s+".*?"+"&gt;";
        encodedInput=Regex.Replace(encodedInput,regex);
    }
    return encodedInput;
}
于 2013-07-12T05:55:54.483 に答える
1

Agilitypack、csquery、Nsoup などの html パーサーを使用して特定の要素を見つけ、ループでデコードすることをお勧めします。

リンクとパーサーの例については、これを確認してください

それを確認してください、私は csquery を使用してそれを行いました:

string input = "&lt;span&gt;i am &lt;strong color=blue&gt;very&lt;/strong&gt; big &lt;br&gt;man.&lt;/span&gt;";
string output = "&lt;span&gt;i am <strong color=blue>very</strong> big <br>man.&lt;/span&gt;";

var decoded = HttpUtility.HtmlDecode(output);
var encoded =input ; //  HttpUtility.HtmlEncode(decoded);

Console.WriteLine(encoded);
Console.WriteLine(decoded);

var doc=CsQuery.CQ.CreateDocument(decoded);

var paras=doc.Select("strong").Union(doc.Select ("br")) ;

var tags=new List<KeyValuePair<string, string>>();
var counter=0;

foreach (var element in paras)
{
    HttpUtility.HtmlEncode(element.OuterHTML).Dump();
    var key ="---" + counter + "---";
    var value= HttpUtility.HtmlDecode(element.OuterHTML);
    var pair= new KeyValuePair<String,String>(key,value);

    element.OuterHTML = key ;
    tags.Add(pair);
    counter++;
}

var finalstring= HttpUtility.HtmlEncode(doc.Document.Body.InnerHTML);
finalstring.Dump();

foreach (var element in tags)
{
finalstring=finalstring.Replace(element.Key,element.Value);
}

Console.WriteLine(finalstring);
于 2013-07-12T05:54:25.870 に答える