用于路径清理PHP的Perl正则表达式



我使用这些代码行来保护我的网站的baseURI和requestURI。这些线条到底是干什么的?我知道他们在某种程度上取代了周围的东西。

$baseURI    = preg_replace('&/+&', '/', rtrim($baseURI, '/')).'/';
$requestURI = preg_replace('&/+&', '/', rtrim($_SERVER['REQUEST_URI'], '/')).'/';
$requestURI = preg_replace('&?.*?$&', '', $requestURI);

第一行和第二行的目标是删除重复的连续斜线,并确保字符串以斜线结束:

rtrim($baseURI, '/') # remove leading slashes
&/+&    # looks for one or more slashes anywhere in the string 
        # to replace them by an unique slash

然后将替换结果与右侧的CCD_ 1连接。

您可以通过以下方式替换这些行:

$baseURI    = preg_replace('~/+|[^/]K$~', '/', $baseURI);
$requestURI = preg_replace('~/+|[^/]K$~', '/', $_SERVER['REQUEST_URI']);

(其中K从匹配结果中删除匹配的开始)

最后一行删除从第一个问号(include)到字符串末尾的所有内容:

?  # literal ?
.*? # all character zero or more time with a lazy quantifier (that is totally useless)
$   # end of the string

您可以将此行替换为:

$requestURI = preg_replace('~?.*$~', '', $requestURI);

$arr = explode('?', $requestURI);
$requestURI = $arr[0];

重要提示:如果我很清楚这一切的目标,第三行必须放在第二行之前,因为它将删除问号中的所有内容(包括斜线)。更好的选择是将最后两行替换为:

$requestURI = preg_replace('~/+|(?:?.*|[^/]K)$~', '/', $_SERVER['REQUEST_URI']);

注2:这里使用的正则表达式模式非常基本。看看一个简单的教程或做一些测试并不是一个坏主意。

最新更新