【问题标题】:C# HtmlDecode Specific tags only仅 C# HtmlDecode 特定标签
【发布时间】:2013-07-12 05:38:20
【问题描述】:

我有一个很大的 htmlencoded 字符串,我只想解码特定的列入白名单的 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);
    }`

【问题讨论】:

  • 你想达到什么目的?可能还有另一种更好的方法。您还可以做的是获取需要解码的文本的子字符串,然后在解码后附加剩余的编码文本。

标签: c# asp.net regex


【解决方案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;
}

【讨论】:

  • +1 了解如何解决问题。 @PeteN 完美,所以您知道如何解决它。您只需调整正则表达式以适应您的特定用例。
  • @winner_joiner 是的 +1 解决方案,老实说,虽然我自己确实做到了这一点,但这是我正在努力解决的正则表达式部分 :)
  • @Anirudh,再次抱歉,仍然无法匹配,您是否假设标签后有空格?
【解决方案2】:

更好的方法是使用一些 html 解析器,如 Agilitypack 或 csquery 或 Nsoup 来查找特定元素并在循环中对其进行解码。

check this for links and examples of parsers

检查一下,我是用 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);

【讨论】:

  • 我可能缺少 HtmlAgility 的某些功能,但如果输入不是 html(因为它已被编码),我不确定这是否有效?
  • @PeteN - 您可以对整个字符串进行 HtmlDecode,然后访问每个元素,如果它不在您的白名单中,请重新编码。
【解决方案3】:

或者您可以根据您的要求使用带有黑名单或白名单的 HtmlAgility。我正在使用列入黑名单的方法。 我的黑名单标签存储在一个文本文件中,例如“script|img”

public static string DecodeSpecificTags(this string content, List<string> blackListedTags)
    {
        if (string.IsNullOrEmpty(content))
        {
            return content;
        }
        blackListedTags = blackListedTags.Select(t => t.ToLowerInvariant()).ToList();
        var decodedContent = HttpUtility.HtmlDecode(content);
        var document = new HtmlDocument();
        document.LoadHtml(decodedContent);
        decodedContent = blackListedTags.Select(blackListedTag => document.DocumentNode.Descendants(blackListedTag))
                .Aggregate(decodedContent,
                    (current1, nodes) =>
                        nodes.Select(htmlNode => htmlNode.WriteTo())
                            .Aggregate(current1,
                                (current, nodeContent) =>
                                    current.Replace(nodeContent, HttpUtility.HtmlEncode(nodeContent))));
        return decodedContent;
    }

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2015-10-02
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多