2010-02-04 76 views
1

我有一个正则表达式,我用它将多个斜杠缩小为单斜线。目的是为了读取已在Apache使用mod_rewrite之前转换为人类可读的链接网址,例如:PHP - 将多个斜线缩减为单斜杠

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参数,但在第二个示例中,如果我展开tracing斜杠,它将返回3段而不是2段。如果参数是空的,我可以在PHP中验证,但如果我使用的是正则表达式,那么如果正则表达式已经为我处理了这个问题,那将会很好,所以我不需要担心段验证。

有什么想法?

回答

7

str_replace函数可能会更快在这种情况下

$uri = str_replace("//","/",$uri) 

其次:使用装饰:http://hu.php.net/manual/en/function.trim.php

$uri = trim($uri,"/"); 
+0

或者特别是ltrim()或rtrim()。 – Notinlist 2010-02-04 15:29:04

+0

谢谢,修剪救了我的一天:D – yoda 2010-02-04 15:32:42

+0

不,但我的脚本结合修剪,处理所有的斜杠我的手指可以打字,直到我累了,所以.. :) – yoda 2010-02-04 16:13:01

2

如何运行在$ URI第二更换?

$uri = preg_replace('#^/#', '', $uri); 

这种方式删除了斜线。在一个preg_replace中完成所有事情都会击败我:) 使用ltrim也可能是一种方法(可能更快)。

1

您可以通过preg_split来分割字符串,而不是完全消毒。不过,你仍然需要处理空白块。

1

可以将所有三个选择组合成一个正则表达式

$urls = array(
    'about/me', 
    '/about//me', 
    '/about///me/', 
    '////about///me//' 
); 

print_r(
    preg_replace('~^/+|/+$|/(?=/)~', '', $urls) 
); 
2

我需要能够单独与各 URL参数工作,但在第二 例如,如果我爆trailling 斜杠,它会返回我3段 而不是2段。此

一个解决方法是设置为PREG_SPLIT_NO_EMPTY第三个参数使用使preg_split:

$uri = '/about//me'; 
$uri_segments = preg_split('#/#', $uri, PREG_SPLIT_NO_EMPTY); 
// $uri_segments[0] == 'about'; 
// $uri_segments[1] == 'me'; 
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/'); 
2

此转换双斜线将字符串中的一个单一的斜杠,但是这个代码的优点是,在字符串(http://)的协议部分中的斜线被保留。

preg_replace("#(^|[^:])//+#", "\\1/", $str); 
+0

对不起,描述缺乏。其实我用这个代码将字符串中的双斜线转换为单斜杠,但此代码的优点是:除http:// – ganji 2014-11-11 14:58:59