如果URI包含扩展名,则正则表达式不匹配

时间:2012-12-14 09:38:18

标签: regex apache .htaccess url-rewriting rewrite

我在一个正在使用的旧项目的htaccess文件中需要一些正则表达式。我想匹配以下的uris

/page?id=12
/admin/users-view?id=3242
/subscribe

可能有也可能没有查询字符串,可能是也可能不是多个段

我需要在查询字符串之前插入.php扩展名。所以第一个例子变成

/page.php?id=12

我也无法将任何uri与文件扩展名匹配,因此图片,js或css文件无法匹配。

我想出了这个:

^([/\w-]+)?/?

除了最后一点之外我还需要做什么。我的正则表达能力很差,所以感谢任何帮助

2 个答案:

答案 0 :(得分:2)

不要用regexp解析URI,php内置了

的函数

http://php.net/manual/en/function.parse-url.php

请注意,还有反向函数可以构建url:

http://php.net/manual/en/function.http-build-url.php

你应该使用它们而不是regexp,因为它们(至少应该)正确处理url编码

答案 1 :(得分:1)

您可能想要考虑使用parse_url反汇编网址并在操作后将其重新组合在一起。

但是,对于纯正则表达式解决方案,我想我会尝试找到以斜杠(或字符串的开头)开头的字符串和不包含句点的问号:

$url = preg_replace('~(^|/)[^.?]*(?=[?]|$)~', '$0.php', $url);

parse_url解决方案看起来像:

$urlParts = parse_url($url);
if(pathinfo($urlParts['path'], PATHINFO_EXTENSION) === null)
    $urlParts['path'] .= '.php';
$url = implode($urlParts);