如何做html标签名称替换令牌
本文关键字:替换 令牌 标签名 何做 html | 更新日期: 2023-09-27 17:51:04
我试图在html中做一个令牌替换我的未标记字符串有多个<input></input>
标记。例如,我想用令牌<<VS_USER_NAME>>
替换name属性。但是我的正则表达式替换了所有的<input>
。下面是一个独立的例子:
这是期望的输出
<div>username <<VS_USER_NAME>></div><div> </div><div>full name <<VS_USER_FULL_NAME>></div><div> </div><div>password <<VS_USER_PASSWORD>></div><div> </div><div>thanks</div>
代码:static void Main(string[] args)
{
string text = "<div>username <input class='"VSField'" contenteditable='"false'" name='"VS_USER_NAME'" style='"background-color: rgb(220,220,200);'">[User Name]</input></div><div> </div><div>full name <input class='"VSField'" contenteditable='"false'" name='"VS_USER_FULL_NAME'" style='"background-color: rgb(220,220,200);'">[Full Name]</input></div><div> </div><div>password <input class='"VSField'" contenteditable='"false'" name='"VS_USER_PASSWORD'" style='"background-color: rgb(220,220,200);'">[Password]</input></div><div> </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);
}
你的正则表达式是贪婪的默认.*
..你必须通过添加?
使其非贪婪。使用以下语句:
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 {{VS_USER_NAME}}</div><div> </div><div>full name {{VS_USER_FULL_NAME}}</div><div> </div><div>password {{VS_USER_PASSWORD}}</div><div> </div><div>thanks</div>
在(X)HTML文档中,{{
和}}
是比<<
和>>
更好的标记。
你可以使用Manage NuGet Packages for Solution菜单项安装htmllagilitypack。