我有一个正则表达式,用于将多个斜杠减少为单斜杠。目的是读取以前使用apache中的mod_rewrite转换为人类可读链接的URL,如下所示:
http://www.website.com/about/me
这有效:
$uri = 'about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes 'about/me'
这不起作用:
$uri = '/about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes '/about/me'
我需要能够单独处理每个url参数,但在第二个示例中,如果我爆炸了trailling斜杠,它将返回3个段而不是2个段。如果参数是空的,我可以在PHP中验证是否有,但是因为我正在使用那个正则表达式,如果正则表达式已经为我处理,那将是很好的,所以我不需要担心段验证
有什么想法吗?
答案 0 :(得分:7)
str_replace可能更快
$uri = str_replace("//","/",$uri)
其次:使用trim:http://hu.php.net/manual/en/function.trim.php
$uri = trim($uri,"/");
答案 1 :(得分:2)
如何在$ uri上运行第二次替换?
$uri = preg_replace('#^/#', '', $uri);
这样就删除了一个尾部斜杠。在一个preg_replace中完成所有操作比我好:) 使用ltrim也可能是一种方法(可能更快)。
答案 2 :(得分:2)
我需要能够与每个人合作 url参数单独,但在第二个 例如,如果我爆炸了 斜线,它将返回我3段 而不是2段。
对此的一个解决方法是使用preg_split,并将第三个参数设置为PREG_SPLIT_NO_EMPTY
:
$uri = '/about//me';
$uri_segments = preg_split('#/#', $uri, PREG_SPLIT_NO_EMPTY);
// $uri_segments[0] == 'about';
// $uri_segments[1] == 'me';
答案 3 :(得分:2)
这会将字符串中的双斜杠转换为单斜杠,但此代码的优点是保留字符串(http://
)的协议部分中的斜杠。
preg_replace("#(^|[^:])//+#", "\\1/", $str);
答案 4 :(得分:1)
您可以通过preg_split
拆分字符串,完全跳过清理。但是你仍然需要处理空块。
答案 5 :(得分:1)
您可以将所有三种选择合并为一个正则表达式
$urls = array(
'about/me',
'/about//me',
'/about///me/',
'////about///me//'
);
print_r(
preg_replace('~^/+|/+$|/(?=/)~', '', $urls)
);
答案 6 :(得分:1)
迟到但所有这些方法都会删除http://
斜杠,但是这个。
function to_single_slashes($input) {
return preg_replace('~(^|[^:])//+~', '\\1/', $input);
}
# out: http://localhost/lorem-ipsum/123/456/
print to_single_slashes('http:///////localhost////lorem-ipsum/123/////456/');