使用正则表达式替换href中多次出现的相同字符串

时间:2014-09-17 14:17:56

标签: asp.net .net regex replace

我们的CMS(我猜错了)在URL中编码逗号字符。因此,CMS不是“?values = 1,2,3”而是呈现“?values = 1%2c2%2c3”。这本身不是问题,但是这些链接指向的外部系统无法处理编码的逗号,只有在我们在查询字符串中传递实际逗号时才有效。

我们已经有一个正则表达式清理工具,可以处理HTML预渲染并清除非XHTML兼容标记。这是在ASP.Net v2上运行的旧CMS。

我的问题是,为逗号替换所有出现的“%2c”需要使用正则表达式,但仅限于此文本存在于锚标记中的位置。我已经很容易地换掉%2c的所有实例,但如果该字符串恰好用于非URL用途,则会冒着在其他地方破坏页面的风险。

我正在使用.Net和System.Text.RegularExpressions。我们有一个包含所有查找和替换规则的XML文件。这会在运行时加载并清除HTML。每条规则包括:

  • 要查找的文字 - 例如"<script>
  • 要替换的文字 - 例如"<script type='text/javascript'>"

然后我们有一些C#循环遍历每个规则并执行以下操作:

// HTML = full page HTML
Regex regex = new Regex(searchTxt, RegexOptions.IgnoreCase);
HTML = regex.Replace(HTML, replaceTxt);

这很简单。我无法为我们的特定场景获得正确的正则表达式语法。

非常感谢你的帮助。

这是一个完整的C#控制台应用程序,希望能够解释我的场景

class Program
{
    static void Main(string[] args)
    {
        string html = GetPageHTML();
        string regexString = "(<a href=).*|(%2c)";
        string replaceTxt = ",";

        RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline;
        Regex regex = new Regex(regexString, options);

        // We are currently using a simple regex.Replace
        string cleanHTML = regex.Replace(html, replaceTxt);

        // But for this example should we be doing something with the Matches collection?
        foreach (Match match in regex.Matches(html))
        {
            if (match.Success)
            {
                // do something?
            }
        }

    }

    private static string GetPageHTML()
    {
        return @"<html>
                    <head></head>
                    <body>
                        <a title='' href='http://www.testsite.com/?x=491191%2cy=291740%2czoom=6%2cbase=demo%2clayers=%2csearch=text:WE9%203QA%2cfade=false%2cmX=0%2cmY=0' target='_blank'>A link</a>
                        <p>We wouldn't want this (%2c) to be replaced</p>
                    </body>
                </html>";
    }
}

1 个答案:

答案 0 :(得分:2)

如果.net支持pcre正则表达式,你可以这样做:

^(?!<a href=").*(*SKIP)(*FAIL)|(%2c)

这就是你想要的。以上正则表达式仅匹配锚标记内的%2c。但是如果你使用正则表达式的正则表达式丢弃技术加上一些逻辑,你就可以达到同样的效果。

如果您使用以下正则表达式,则可以匹配%2c并捕获锚标记内的%2c字符串:

^(?!<a href=").*|(%2c)

<强> Working demo

enter image description here

因此,您可以做的是添加逻辑并检查捕获组内容是否等于%2c,在这种情况下意味着它与锚标记中的%2c匹配。然后你可以替换逗号。

相关问题