我们的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);
这很简单。我无法为我们的特定场景获得正确的正则表达式语法。
非常感谢你的帮助。
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>";
}
}
答案 0 :(得分:2)
如果.net支持pcre正则表达式,你可以这样做:
^(?!<a href=").*(*SKIP)(*FAIL)|(%2c)
这就是你想要的。以上正则表达式仅匹配锚标记内的%2c
。但是如果你使用正则表达式的正则表达式丢弃技术加上一些逻辑,你就可以达到同样的效果。
如果您使用以下正则表达式,则可以匹配%2c
并捕获锚标记内的%2c
字符串:
^(?!<a href=").*|(%2c)
<强> Working demo 强>
因此,您可以做的是添加逻辑并检查捕获组内容是否等于%2c
,在这种情况下意味着它与锚标记中的%2c
匹配。然后你可以替换逗号。