正则表达式中的逻辑

时间:2009-04-15 16:11:21

标签: regex logic

我正在整理一些regexp来处理将旧网站的传入链接重定向到新网站上的等效页面。我希望我能在regexp中处理以下情况,所以我不必在后端执行此操作:

传入链接: /reservations/inn_details.asp?num=717

重定向链接: /reservations/property-detail.aspx?pid=00717

如您所见,重定向链接中原始查询字符串值717需要为00717。规则是这些ID在重定向的URL中都需要五个字符长。

所以我的问题是:在regexp中是否有可能弄清楚查询字符串值有多少个字符,然后将足够的前导0添加到它等于五个字符?

我可以做四个单独的正则表达式来覆盖值为1,2,3或4位数的情况,但是它一点都处理它会更酷!

谢谢, 乙

5 个答案:

答案 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;

但这当然只是解决了你的一个转型问题。