我正在建立一个路线系统,因此需要接收路线变量。
问题是它完全有效,直到我有"/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
的变量?
答案 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
)