正则表达式和尾随斜杠

时间:2011-06-17 20:54:02

标签: php regex

我在PHP中使用preg_match / preg_replace函数:

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

=>

test/\1_\2/\3/

我想要的是,如果它只说http://domain.com/test那么无论是否有一个尾随斜线并不重要 - 我该怎么做?

编辑:

我这样做:

我有这个数组:

$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',
);

我所做的是,我执行此操作来路由URL:

global $routing;

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

return ($url);

我的框架在路由中执行此操作:

E.g。网址可以     测试/堆叠/你好/ 21 这是=到     测试:: stack_hello(21)

所以设置实际上是: controller / func / tion / parameter = function / func_tion / parameter。

1 个答案:

答案 0 :(得分:0)

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

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

$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/

相关问题