2

我正在构建一个路由系统,因此需要接收路由变量。问题是它完美地工作,直到我有类似"/post/edit/some-stuff-to-check"( "-"char)

看这个

$pattern = 'post/edit/(\w+)';

$pattern = '/' . str_replace('/', '\/', $pattern) . '/i';

// Note, the "test" is a variable here
$uri = 'post/edit/test';

if (preg_match($pattern, $uri, $params)) {

        // It works, outputs exactly what I need

        // Array ( [0] => post/edit/test [1] => test ) Array ( ) 

        print_r($params);

}

但是当一个 uri 包含一个变量 like/post/edit/foo-bar-test时,它​​就不再起作用了。所以我尝试通过正则表达式类显式匹配,而不是这样:

$pattern = 'post/edit/(\w+)';

我用这个:

$pattern = 'post/edit/[a-zA-Z0-9_-]';

但没有运气。

所以问题是,如何正确匹配包含[A-Za-z0-9_-]URI字符串中的变量?

4

1 回答 1

4

我用这个:$pattern = 'post/edit/[a-zA-Z0-9_-]';

问题在于,字符集仅匹配单个字符,即您缺少它+背后的字符。

也就是说,您还可以创建一个字符集\w并添加破折号:

$pattern = '~post/edit/([\w-]+)~i';

在上述模式中,我使用~了表达式分隔符;这允许在内部使用斜线而不转义它们。

例子

$input = '/post/edit/some-stuff-to-check';
$pattern = '~post/edit/([\w-]+)~i';
preg_match($pattern, $input, $matches);
print_r($matches);

输出:

Array
(
    [0] => post/edit/some-stuff-to-check
    [1] => some-stuff-to-check
)
于 2013-06-17T02:34:35.293 回答