我在一个正在使用的旧项目的htaccess文件中需要一些正则表达式。我想匹配以下的uris
/page?id=12
/admin/users-view?id=3242
/subscribe
可能有也可能没有查询字符串,可能是也可能不是多个段
我需要在查询字符串之前插入.php
扩展名。所以第一个例子变成
/page.php?id=12
我也无法将任何uri与文件扩展名匹配,因此图片,js或css文件无法匹配。
我想出了这个:
^([/\w-]+)?/?
除了最后一点之外我还需要做什么。我的正则表达能力很差,所以感谢任何帮助
答案 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);