C# Regex-如何进行html标记名替换标记
我正在尝试在html中替换令牌 我的未分类字符串有多个C# Regex-如何进行html标记名替换标记,c#,regex,C#,Regex,我正在尝试在html中替换令牌 我的未分类字符串有多个标记。例如,我想用标记替换name属性。但不管怎样,我的正则表达式都会替换所有的。下面是一个独立的例子 这是期望的输出 <div>username <<VS_USER_NAME>></div><div> </div><div>full name <<VS_USER_FULL_NAME>&g
标记。例如,我想用标记
替换name属性。但不管怎样,我的正则表达式都会替换所有的
。下面是一个独立的例子
这是期望的输出
<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(字符串[]args)
{
string text=“用户名[用户名]全名[全名]密码[密码]谢谢”;
字符串textTokenised=GetTokenisedText(文本,“VS_用户名”、“VS_用户名”、“VS_用户名”、“VS_用户名”、“VS_密码”);
}
私有静态字符串GetTokenisedText(字符串未加密,参数字符串[]令牌密钥)
{
foreach(tokenKey中的字符串tokenKey)
{
字符串string2=GetToken(tokenKey);
字符串string1=GetRegex(tokenKey);
untokenised=正则表达式替换(untokenised,string1,string2);
}
未经处理的返回;
}
私有静态字符串GetToken(字符串令牌密钥)
{
返回string.Format(“,tokenKey);
}
私有静态字符串GetRegex(字符串令牌密钥)
{
返回string.Format(“()]*e*)name=\“{0}\”([^>]*e*)>(*)”,tokenKey);
}
您的正则表达式在默认情况下是贪婪的。。您必须通过添加?
使其不贪婪。使用以下命令:
return string.Format("()<input([^>]*e*)name=\"{0}\"([^>]*e*)>(.*?)</input>", tokenKey);
↑
returnstring.Format(“()]*e*)name=\“{0}\”([^>]*e*)>(.*),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;
}
输出:
用户名{{VS_用户名}全名{{VS_用户名}密码{VS_用户名}谢谢
{{
和}
在(X)HTML文档中是优于
的标记
右键单击解决方案时,可以使用“管理解决方案的NuGet软件包”菜单项安装HTMLAGILITPACK。不要。不要使用正则表达式解析HTML。使用HTML语法分析器。希望与非语法分析器匹配(我也喜欢您的方法和HtmlAgilityPack:)请随意投票。还要注意的是,如果您有巨大的HTML页面,并且没有匹配项,那么使用
*?
regex可能会遇到灾难性的回溯。我已经见过好几次了,这就是为什么我建议使用替代品。
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;
}