PHP - 将多个斜杠减少为单斜杠

时间:2010-02-04 15:23:20

标签: php regex preg-replace

我有一个正则表达式,用于将多个斜杠减少为单斜杠。目的是读取以前使用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中验证是否有,但是因为我正在使用那个正则表达式,如果正则表达式已经为我处理,那将是很好的,所以我不需要担心段验证

有什么想法吗?

7 个答案:

答案 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/');