62,046
社区成员
发帖
与我相关
我的任务
分享
protected void Page_Load(object sender, EventArgs e)
{
UrlRewriteRoute test = new UrlRewriteRoute();
//test.VirtualPath = @"~/数字(\d+)/字符(\w+)/字母([a-zA-Z]*)-无厘头(.*)\.html";
//test.ToUrl = @"~/1.aspx?字母=$3 字符=$2 无厘头=$4 数字=$1";
test.VirtualPath = @"~/([a-zA-Z]*)\/(.[0-9]*[a-zA-Z]*)/([0-9]*)/([0-9]*)/([a-zA-Z]*)\.aspx";
test.ToUrl = @"~/WebPage/$1/$2.aspx?classid=$2;page=$3;keys=$4";
var result = ReverseRoute(test);
Response.Write(test.VirtualPath + "<br/>" + test.ToUrl + "<br/><br/>");
Response.Write(result.VirtualPath + "<br/>" + result.ToUrl + "<br/>");
}
public static UrlRewriteRoute ReverseRoute(UrlRewriteRoute route)
{
UrlRewriteRoute result = new UrlRewriteRoute();
List<string> virtualList = new List<string>();
Regex virtualReg = new Regex(@"\((.+?)\)");
foreach (Match m in virtualReg.Matches(route.VirtualPath))
{
virtualList.Add(m.Groups[1].Value);
}
string[] virtual_strs = virtualList.ToArray(); //虚拟URL的正则组内容
Regex tourlReg = new Regex(@"\$(\d+)");
List<string> tourlList = new List<string>();
foreach (Match m in tourlReg.Matches(route.ToUrl))
{
tourlList.Add(m.Value);
}
string[] tourl_strs = tourlList.ToArray(); //实际URL的正则组内容
string New_toUrl = route.VirtualPath;
string New_virtualUrl = route.ToUrl;
int k =1;
foreach (string s in tourl_strs) //循环实际url
{
int i = Convert.ToInt32(s.TrimStart('$'));
if (virtual_strs.Length >= i)
{
New_virtualUrl = New_virtualUrl.Replace("$" + i.ToString(), string.Format("({0})", virtual_strs[i - 1]));
New_toUrl = New_toUrl.Replace("(" + virtual_strs[i - 1] + ")", "$"+k.ToString()); //这样防止正规则中不按顺序写也能反转对应
k += 1;
}
}
result.ToUrl = New_toUrl;
result.VirtualPath = New_virtualUrl;
return result;
}
public class UrlRewriteRoute
{
public string VirtualPath { get; set; }
public string ToUrl { get; set; }
}
// 我大概的写写,里面关键的集合匹配以及构造虚拟url的代码不知道怎样写了
// 希望高手帮忙. 或提供下其他的思路
public static getUrl(string originalUrl)
{
if(systemIsUrlRewrite)
{
foreach(reurl in reurls)//遍历重写的正则集合
{
if(originalUrl 匹配 reurl.toUrl)
{
return build_virtualUrl(reurl,originalUrl);//如果集合中有此url的重写规则,就输出此源url的虚拟url,也得用正则吧?
}
}
}
else
{
return originalUrl;//系统没开启url重写,直接返回原始url
}
}