无法在URI字符串中正确匹配“ - ”

时间:2013-06-17 02:32:43

标签: php regex

我正在建立一个路线系统,因此需要接收路线变量。 问题是它完全有效,直到我有"/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包含一个像/post/edit/foo-bar-test这样的变量时,它就不再起作用了。所以我试图通过regex类明确匹配,所以代替:

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

我用过这个:

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

但没有运气。

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

1 个答案:

答案 0 :(得分: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
)