我想生成一个使用正则表达式的网址,如(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);
}
}
和RedirectModel
有string
类型的两个简单属性:FromUrl
和ToUrl
。
你能帮助我如何实现正则表达式方面吗?对于我管理的简单网址
答案 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");