我希望在不更改其布局的情况下加密HTML文档的文本内容。内容以成对的标签存储,如下所示:< span style ...> text_to_get< /跨度取代。我的想法是使用Regex检索(1)并用加密文本替换每个文本部分(2)。我完成了步骤(1),但在步骤(2)遇到了麻烦。这是我正在处理的代码:
private string encryptSpanContent(string text, string passPhrase, string salt, string hash, int iteration, string initialVector, int keySize)
{
string resultText = text;
string pattern = "<span style=(?<style>.*?)>(?<content>.*?)</span>";
Regex regex = new Regex(pattern);
MatchCollection matches = regex.Matches(resultText);
foreach (Match match in matches)
{
string replaceWith = "<span style=" + match.Groups["style"] + ">" + AESEncryption.Encrypt(match.Groups["content"].Value, passPhrase, salt, hash, iteration, initialVector, keySize) + "</span>";
resultText = regex.Replace(resultText, replaceWith);
}
return resultText;
}
这是错误的行(这会使所有文本被最后一个replaceWith值替换)吗?
resultText = regex.Replace(resultText, replaceWith);
有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
如果您要使用HTML,建议您使用HTML Agility Pack,因为您可能会遇到正则表达式的问题,尤其是嵌套标记或格式错误的HTML。
假设您的HTML格式正确且您决定使用正则表达式,则应使用接受MatchEvaluator
的{{3}}来替换所有匹配项。
尝试这种方法:
string input = @"<div><span style=""color: #000;"">hello, world!</span></div>";
string pattern = @"(?<=<span style=""[^""]+"">)(?<content>.+?)(?=</span>)";
string result = Regex.Replace(input, pattern,
m => AESEncryption.Encrypt(m.Groups["content"].Value, passPhrase, salt, hash, iteration, initialVector, keySize));
这里我使用MatchEvaluator
的lambada表达式,并参考上面显示的“content”组。我还对span
标签使用环视,以避免将它们包含在替换模式中。
答案 1 :(得分:-2)
这是一个替换HTML标签的简单解决方案
string ReplaceBreaks(string value)
{
return Regex.Replace(value, @"<(.|\n)*?>", string.Empty);
}