使用Regex替换HTML标记内容

时间:2012-03-19 16:28:52

标签: c# .net html regex replace

我希望在不更改其布局的情况下加密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);

有人可以帮我解决这个问题吗?

2 个答案:

答案 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);
}