2011-06-17 119 views
1

我在PHP与的preg_match/preg_replace函数的功能正则表达式:正则表达式和斜线

/test\/([A-Za-z]+)\/([A-Za-z]+)\/?([A-Za-z]+)?\/?/ 

=> 

test/\1_\2/\3/ 

我要的是,如果它只是说http://domain.com/test那么不要紧wheter存在是否跟踪斜线 - 我该怎么做?

编辑:

我这样做:

我有这样的数组:

$routing = array(
    '/test\/([A-Za-z]+)\/([A-Za-z]+)\/?([A-Za-z]+)?\/?/' => 'test/\1_\2/\3/', 

    '/error\/([0-9]+)/' => 'error/error_\1', 
    '/sitemap\.html/' => 'sitemap', 
    '/search\/([^\/]+)?/' => 'search/view/$1', 
); 

我要做的就是,我执行此操作路由的网址:

global $routing; 

foreach ($routing as $pattern => $result) { 
    if (preg_match($pattern, $url)) { 
     return preg_replace($pattern, $result, $url); 
    } 
} 

return ($url); 

我的框架是这样做的路由:

E.g.该URL可以是 测试/堆栈/你好/ 21 这是=到 测试:: stack_hello(21)

所以设置实际上是: 控制器/ FUNC /灰/参数=功能/ func_tion /参数。

+5

我建议你第一个和最后一个字符变成别的东西。这样,你不必逃避所有'/'字符。 –

+0

它必须以斜线结束否则最终会出现解析错误? :) –

+3

它不必:http://php.net/manual/en/regexp.reference.delimiters.php – mario

回答

0
$regex = '#test(?:/([a-z]+))(?:/([a-z]+))(?:/([a-z]+))/?$#i'; 

这包含测试的字符串,然后是/和一系列字母匹配,则该模式被重复两次以上。要匹配的字符串的最后一个字符是可选的/(然后该字符串应该因$而结束)。该模式重复三次,因为这是所有三个匹配可以用作替换模式的唯一方式。

$text = 'test/abc/de/f'; 
$replacement = 'test/\1_/\3/\2/'; // de and f should switch places 
var_dump(preg_replace($regex, $replacement, $text)); 

,显示字符串test/abc_/f/de/

+0

它又如何与“另一面”相匹配? 我可以重复使用'admix/\ 1_ \ 2/\ 3 /'吗? :-) –

+0

@丹尼斯:你有没有在谈论替换字符串?如果是这样,请更新问题以清除该问题,并显示当前的preg_replace调用。 – mario

+0

我得到这个错误:警告:preg_match():未知修饰符')'当我使用你的解决方案。我会更新我的问题,以便更明确地说明问题所在:)感谢 –