用于重写URL的正则表达式,以排除以年开头的字符串

时间:2015-02-09 11:45:47

标签: regex

我有一个新闻页面,可以根据查询字符串检测标签。例如,过滤掉所有标题为“热门'”的新闻文章。我有:

<mydomain>/news/?tag=popular

我已在配置中使用以下内容设置了网址重写:

<add name="newsrewrite"
     virtualUrl="^~/news/(.*)"
     rewriteUrlParameter="ExcludeFromClientQueryString"
     destinationUrl="~/news?tag=$1"
     ignoreCase="true" />

这很好用。但是我注意到我现在无法访问特定的新闻文章网址,因为它将/ news /之后的任何内容视为查询字符串参数。

即。如果我尝试访问/ news / 2015 / news-article-1,那么它将无法工作,因为重写规则基本上将2015 / news-article-1视为参数。

由于我在年份文件夹下构建了我的新闻文章,所有新闻文章将始终通过/ news / YYYY / article-title访问,其中YYYY为4位数年份。

我可以在这里使用正则表达式,在/ news /之后取任何东西并将其用作查询字符串参数除了以4位整数开头的那些吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果你正在寻找一个像你一样工作的正则表达式,除了它不匹配/ news / YYYY / ..看看这个:

^\/news\/(?!\d{4})(.*)$

注意:它使用负前瞻(检查在特定情况下是否支持它们)。另请注意转义字符\

阅读你的问题我也谈到了一个不同的方法:如何通过重写仅匹配实际标签结构的页面进行映射?像这样:

<add name="newsrewrite"
     virtualUrl="^~/news/?tag=(.*)"
     rewriteUrlParameter="ExcludeFromClientQueryString"
     destinationUrl="~/news?tag=$1"
     ignoreCase="true" />

请注意,$1将仅包含代码中的标记(不是?tag=Popular)。这应该只匹配/news/?tag=SOMETHING形式的网址,因此与您的文章页面不匹配。