最近的一个需求,需要把网站的一些老的url做301跳转至新url,新老地址的path格式不一致,比如:
老url:
http://www.old.com/path/abc/shanghai-123/?p=xxx
新url:
http://www.new.com/path/shanghai-abc-123/?p=xxx
换一种方式表示可以看成是:
老url(其中包含两个变量):
http://www.old.com/path/abc/{cityname}-{cityid}/?p=xxx
新url(同上,但位置可能不同):
http://www.new.com/path/{cityname}-abc-{cityid}/?p=xxx
利用正则表达式抓取特定变量:
1、首先在配置中心做如下配置:
{
"match": "http://www.old.com/path/abc/",
"template": "http://www.new.com/path/{0}-abc-{1}/",
"regex": "path/abc/(?<cityname>\\w+)-(?<cityid>\\d+)",
"params": ["cityname","cityid"]
}
其中比较关键的是regex:"path/abc/(?<cityname>\w+)-(?<cityid>\d+)",已知老url满足path以path/abc/开头,后面是{cityname}-{cityid}。其中cityname是任意字母和数字组合但不包含空白符,用\w表示,cityid是数值用\d表示。
2、编码:
private static void group() {
String url = "http://www.old.com/path/abc/shanghai-123/";
String reg = "path/abc/(?<cityname>\\w+)-(?<cityid>\\d+)";
Pattern pat = Pattern.compile(reg);
Matcher mat = pat.matcher(url);
if (mat.find()) {
System.out.println(mat.group("cityname"));
System.out.println(mat.group("cityid"));
}
}
输出:
shanghai
123
3、替换新模板:
private static void group() {
String template = "http://www.new.com/path/{0}-abc-{1}/";
String[] params = {"cityname", "cityid"};
String url = "http://www.old.com/path/abc/shanghai-123/";
String reg = "path/abc/(?<cityname>\\w+)-(?<cityid>\\d+)";
Pattern pat = Pattern.compile(reg);
Matcher mat = pat.matcher(url);
if (mat.find()) {
String[] values = new String[params.length];
for (int i = 0; i < params.length; i++) {
values[i] = mat.group(params[i]);
}
String result = MessageFormat.format(template, values);
System.out.println(result);
}
}
输出:
http://www.new.com/path/shanghai-abc-123/
扩展
1、如果{cityname}本身也包含“-”,可以将regex 改成如下:
String reg = "path/abc/(?<cityname>[\\w,-]+)-(?<cityid>\\d+)";
2、如果path有多个满足用“-”拼接的参数,比如url:http://www.old.com/path/abc/shanghai-123/type-1/?p=xxx,这种情况可以将regex 补全,即:
String reg = "path/abc/(?<cityname>[\\w,-]+)-(?<cityid>\\d+)/type-1";
3、上述情况,如果“type-1”中的1也是变量,同样可以抓取,如:
String reg = "path/abc/(?<cityname>[\\w,-]+)-(?<cityid>\\d+)/type-(?<type>\\d+)";
网友评论