[英]Logic in a regular expression
我正在整理一些regexp来处理将旧站点的传入链接重定向到新站点上的等效页面。 我希望我能在正则表达式中处理以下情况,所以我不必在后端执行此操作:
传入链接:/reservations/inn_details.asp?num = 717
重定向链接:/reservations/property-detail.aspx?pid=00717
如您所见,重定向链接中原始查询字符串值717需要为00717。 规则是这些ID在重定向的URL中都需要五个字符长。
所以我的问题是:在regexp中是否有可能弄清楚查询字符串值有多少个字符,然后将足够的前导0添加到它等于五个字符?
我可以做四个独立的正则表达式来覆盖值为1,2,3或4位数的情况,但是它会更加冷却一下子处理它们!
谢谢,B。
不幸的是,这不是单独用正则表达式处理的东西。 在我看来,最简单的修复方法是更改property-detail.aspx以进行零填充。
我的意思是,只需将正则表达式重定向到“/reservations/property-detail.aspx?pid=717”,并让aspx文件在pid前面添加必要的零,然后再获取数据。 无论如何必须有一些代码来清理那个输入(或者至少我希望如此),所以它可以很容易地添加到那个部分。
如果你想使用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]
没有人知道在一些随机正则表达式实现中可能存在什么,但至少对于真正的正则表达式,没有。
你还没有解释你正在使用正则表达式的通用语言。 但是,大多数语言都提供了使用正则表达式来匹配和替换文本的功能。 匹配字符串的数字部分,然后使用您的语言的功能用前导零填充数字。
[?&]num=(\\d+)
将为您获取值。 但正则表达式不实现逻辑,只实现模式识别。 您的语言或工具集需要提供一种分析和处理它的方法。
例如在perl中,您可以:
s/([?&])num=(\d+)/sprintf( "%spid=%5.5d", $1, $2 )/e;
但这当然只是解决了你的一个转型问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.