在C#中将正则表达式中的url生成到其他地址

时间:2017-05-10 08:57:58

标签: c# asp.net

我想生成一个使用正则表达式的网址,如(currentUrlRegex

currentUrlRegex = @"https://www.website.com/[a-z]{2})-[a-z]{2})/file/(.*)";

并将重定向到:

toUrlRegex = @"https://www.website.com/$1-$2/file/system/$3";

如果有人访问:https://www.website.com/en-en/file/123.png,则会重定向到https://www.website.com/en-en/file/system/123.png

我想将请求中的当前url(在ASP.NET MVC中)与currentUrlRegex进行匹配。如果匹配,则重定向到toUrlRegex中与转化匹配的网址。

我将这些正则表达式网址放在一个由CMS管理的文件中(可以添加,删除,重命名等)

我创建了一个HTTP模块:

public void Init(HttpApplication context)
{
    _context = context;
    context.PostResolveRequestCache += ContextOnPostResolveRequestCache;
}

private void ContextOnPostResolveRequestCache(object sender, EventArgs eventArgs)
{
  string currentUrl = _context.Request.Url.GetLeftPart(UriPartial.Path).TrimEnd('/');

  // read all kind of regex urls from a file into a list of RedirectModel

        string redirectUrl = string.Empty;

        foreach (RedirectModel redirectModel in list) {
           try {
              string url = new Uri(redirectModel.FromUrl).GetLeftPart(UriPartial.Path).TrimEnd('/');
              if (url.Equals(currentUrl, StringComparison.InvariantCultureIgnoreCase)) {
                 redirectUrl = redirectModel.ToUrl;
                 break;
              }
           } catch {
              // use regex here when Uri is invalid (contains *,),(, etc)
           }
        }

        if (!string.IsNullOrWhiteSpace(redirectUrl)) {
           _context.Response.RedirectPermanent(redirectUrl);
        }
}

RedirectModelstring类型的两个简单属性:FromUrlToUrl

你能帮助我如何实现正则表达式方面吗?对于我管理的简单网址

2 个答案:

答案 0 :(得分:0)

网址转换可能看起来像这样

var input = @"https://www.website.com/en-en/file/123.png";
Regex rgx = new Regex(@"https://www.website.com/([a-z]{2})-([a-z]{2})\/file\/(.*)");
MatchCollection m = rgx.Matches(input);

if (m.Count > 0 && m.Count == 1)
{
    var matchGroup = m[0].Groups;
    var redirecturl = string.Format("https://www.website.com/{0}-{1}/file/system/{2}", matchGroup[1].Value, matchGroup[2].Value, matchGroup[3].Value);
}

答案 1 :(得分:0)

使用Regex.Replace和字符串大部分就像你提供的那样,只需在搜索模式中使用更正的括号。

var input = @"https://www.website.com/en-en/file/123.png";
var output = Regex.Replace(
    input,
    @"https://www.website.com/([a-z]{2})-([a-z]{2})/file/(.*)",
    @"https://www.website.com/$1-$2/file/system/$3");