RegEx匹配替换帮助

时间:2009-01-20 15:38:28

标签: regex .htaccess mod-rewrite

我正在尝试进行正则表达式匹配并替换.htaccess文件,但我无法弄清楚替换位。我认为我的比赛部分是正确的,但也许有人可以提供帮助。

我有这个网址 - http://www.foo.com/MountainCommunities/Lifestyles/5/VacationHomeRentals.aspx

我正试图把它变成这个 - http://www.foo.com/mountain-lifestyle/Vacation-Home-Rentals.aspx

(MountainCommunities /生活方式)/ \ d /(。*)(C ++)

然后我想我会有一个像这样的重写规则 -

山生活方式/ $ 2 $ 3

但是我需要在这个实例中使用$ 2中的内容并重写它以在大写字母的单词之间放置破折号。现在我很难过。

6 个答案:

答案 0 :(得分:4)

我认为你必须用两位进行...取出$ 2,在每个大写(除了第一个)之前加上 - ,然后使用只需将结果附加到http://www.foo.com/mountain-lifestyle/。 aspx最后。

答案 1 :(得分:2)

试试这个:

RewriteRule ^(([A-Z][a-z]+-)*)([A-Z][a-z]+)(([A-Z][a-z]+)+)(\.aspx)?$ /$1$3-$4 [N]
RewriteRule ^([A-Z][a-z]+-)+[A-Z][a-z]+$ /$0.aspx [R=301]

请注意,mod_rewrite使用内部计数器来检测并避免无限循环。因此,您的网址可能不会包含太多必须转换的字词(请参阅MaxRedirects option表示Apache< 2.1和LimitInternalRecursion directive表示Apache≥2.1)。

答案 2 :(得分:1)

我不认为用正则表达式可以用大写字母做什么......

您最好在网址中保留破折号并删除.aspx

例如:http://www.foo.com/MountainCommunities/Lifestyles/5/Vacation-Home-Rentals

这需要以下规则:

^/MountainCommunities/Lifestyles/5/([^/]+)/\?([^/]+)   /mountain-lifestyle/$1.aspx?$2 [I]

这也考虑了发送到页面的任何查询字符串。

BTW:你如何在IIS中使用.htaccess?

答案 3 :(得分:1)

您可以在中间位“VacationHome”上使用正则表达式“([AZ])”,替换为正则表达式“ - $ 1” - 这将为您提供“-Vacation-Home-Rentals” - 然后您就可以砍掉第一个字符,然后将URL的第一部分粘贴在前面,将.aspx粘贴在最后。

答案 4 :(得分:1)

我认为主要的正则表达式是由其他人编写的,但是要匹配请求名称以放置破折号(假设所有文件名都有三个名字的驼峰表示法式'a'VacationHomeRentals.aspx':

RewriteRule: ^/MountainCommunities/Lifestyles/\d+/([A-Z][a-z]+)([A-Z][a-z]+)([A-Z][a-z]+)\.aspx$ /mountain-lifestyle/$1-$2-$3.aspx

这是@Gumbo回复的限制版本,因为我没有机会测试他的递归。递归技术绝对是最好的,也是最适用于任何场景的。

答案 5 :(得分:0)

我认为我不太明白你想要做什么。你为什么不能简单地搜索:

http://www.foo.com/MountainCommunities/Lifestyles/5/VacationHomeRentals.aspx

并将其替换为:

http://www.foo.com/mountain-lifestyle/Vacation-Home-Rentals.aspx

或者这是你试图转变的模式的具体例子吗?