【发布时间】:2014-09-17 14:17:55
【问题描述】:
我们的 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>";
}
}
【问题讨论】:
-
HttpServerUtility.UrlDecode 试过了吗?
-
没有。我在内存中没有可以执行此操作的字符串实例。我只有整个 HTML 页面,我可以在其中有效地使用正则表达式进行查找和替换。
标签: asp.net .net regex replace