1

我遇到了一些正则表达式,这在我承担的旧项目的 htaccess 文件中需要。我想匹配以下uri

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

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

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

/page.php?id=12

我也无法将任何带有文件扩展名的 uri 匹配,因此无法匹配图像、js 或 css 文件。

我想出了这个:

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

除了最后一点之外,它可以满足我的需求。我的正则表达式技能很差,所以任何帮助表示赞赏

4

2 回答 2

2

不要用正则表达式解析 URI,php 已经为此内置了函数

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

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

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

您应该使用它们而不是正则表达式,因为它们将(至少应该)正确处理 url 编码

于 2012-12-14T09:40:19.607 回答
1

您可能想考虑拆解 URLparse_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);
于 2012-12-14T09:41:16.257 回答