如何做html标签名称替换令牌

本文关键字:替换 令牌 标签名 何做 html | 更新日期: 2023-09-27 17:51:04

我试图在html中做一个令牌替换我的未标记字符串有多个<input></input>标记。例如,我想用令牌<<VS_USER_NAME>>替换name属性。但是我的正则表达式替换了所有的<input>。下面是一个独立的例子:

这是期望的输出

<div>username&nbsp;<<VS_USER_NAME>></div><div>&nbsp;</div><div>full name&nbsp;<<VS_USER_FULL_NAME>></div><div>&nbsp;</div><div>password&nbsp;<<VS_USER_PASSWORD>></div><div>&nbsp;</div><div>thanks</div>
代码:

static void Main(string[] args)
    {
        string text = "<div>username&nbsp;<input class='"VSField'" contenteditable='"false'" name='"VS_USER_NAME'" style='"background-color: rgb(220,220,200);'">[User Name]</input></div><div>&nbsp;</div><div>full name&nbsp;<input class='"VSField'" contenteditable='"false'" name='"VS_USER_FULL_NAME'" style='"background-color: rgb(220,220,200);'">[Full Name]</input></div><div>&nbsp;</div><div>password&nbsp;<input class='"VSField'" contenteditable='"false'" name='"VS_USER_PASSWORD'" style='"background-color: rgb(220,220,200);'">[Password]</input></div><div>&nbsp;</div><div>thanks</div>";
        string textTokenised = GetTokenisedText(text, "VS_USER_NAME", "VS_USER_FULL_NAME", "VS_USER_PASSWORD");
    }
private static string GetTokenisedText(string untokenised, params string[] tokenKeys)
    {
        foreach (string tokenKey in tokenKeys)
        {
            string string2 = GetToken(tokenKey);
            string string1 = GetRegex(tokenKey);
            untokenised = Regex.Replace(untokenised, string1, string2);
        }
        return untokenised;
    }

    private static string GetToken(string tokenKey)
    {
        return string.Format("<<{0}>>", tokenKey);
    }

    private static string GetRegex(string tokenKey)
    {
        return string.Format("()<input([^>]*e*)name='"{0}'"([^>]*e*)>(.*)</input>", tokenKey);            
    }

如何做html标签名称替换令牌

你的正则表达式是贪婪的默认.* ..你必须通过添加?使其非贪婪。使用以下语句:

return string.Format("()<input([^>]*e*)name='"{0}'"([^>]*e*)>(.*?)</input>", tokenKey); 
                                                                ↑

下面是HtmlAgilityPack的一个示例:

private static string GetTokenisedText(string untokenised, params string[] tokenKeys)
{
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(untokenised);
    var query = doc.DocumentNode.Descendants("input");
    foreach (var item in query.ToList())
    {
        var value = item.GetAttributeValue("name", string.Empty);
        if (!string.IsNullOrEmpty(value))
        {
           var token = tokenKeys.Where(p => p == value).FirstOrDefault();
           if (!string.IsNullOrEmpty(token))
           {
               item.NextSibling.Remove();
               var newNode = HtmlAgilityPack.HtmlTextNode.CreateNode(string.Format("{{{{{0}}}}}", token.ToUpper()));
               item.ParentNode.ReplaceChild(newNode, item);
           }
        }
    }
    return doc.DocumentNode.OuterHtml;
}
输出:

<div>username&nbsp;{{VS_USER_NAME}}</div><div>&nbsp;</div><div>full name&nbsp;{{VS_USER_FULL_NAME}}</div><div>&nbsp;</div><div>password&nbsp;{{VS_USER_PASSWORD}}</div><div>&nbsp;</div><div>thanks</div>

在(X)HTML文档中,{{}}是比<<>>更好的标记。

你可以使用Manage NuGet Packages for Solution菜单项安装htmllagilitypack。