我正在整理一些regexp来处理将旧网站的传入链接重定向到新网站上的等效页面。我希望我能在regexp中处理以下情况,所以我不必在后端执行此操作:
传入链接: /reservations/inn_details.asp?num=717
重定向链接: /reservations/property-detail.aspx?pid=00717
如您所见,重定向链接中原始查询字符串值717需要为00717。规则是这些ID在重定向的URL中都需要五个字符长。
所以我的问题是:在regexp中是否有可能弄清楚查询字符串值有多少个字符,然后将足够的前导0添加到它等于五个字符?
我可以做四个单独的正则表达式来覆盖值为1,2,3或4位数的情况,但是它一点都处理它会更酷!
谢谢, 乙
答案 0 :(得分:6)
不幸的是,这不是单独用正则表达式处理的东西。在我看来,最简单的修复方法是更改property-detail.aspx以进行零填充。
我的意思是,只需将正则表达式重定向到“/reservations/property-detail.aspx?pid=717”,然后让aspx文件在pid前面添加必要的零,然后才能获取数据。无论如何都必须有一些代码来清理那个输入(或者至少我希望如此),所以它可以很容易地添加到那个部分。
答案 1 :(得分:2)
如果你想使用mod_rewrite,有办法做到这一点:
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)num=(\d+)(.*)
RewriteCond 0000%3 ^0+(\d{5})$
RewriteRule ^/reservations/inn_details\.asp$ /reservations/property-detail.aspx?pid=%1 [L,R=301]
答案 2 :(得分:0)
没有人知道在一些随机正则表达式实现中可能存在什么,但至少对于真正的正则表达式,没有。
答案 3 :(得分:0)
您还没有解释您正在使用正则表达式的通用语言。但是,大多数语言都提供了使用正则表达式来匹配和替换文本的功能。匹配字符串的数字部分,然后使用您的语言的功能用前导零填充数字。
答案 4 :(得分:0)
[?&]num=(\d+)
将为您获得价值。但正则表达式不实现逻辑,只实现模式识别。您的语言或工具集需要提供一种分析和处理它的方法。
例如在perl中,您可以:
s/([?&])num=(\d+)/sprintf( "%spid=%5.5d", $1, $2 )/e;
但这当然只是解决了你的一个转型问题。