我正在构建一个路线系统,并且需要URI segment
完全匹配的变量[A-Za-z]
非常重要的是要注意,变量可以在任何位置(不仅在开头或结尾),
例如,这可能是
/post/(:letter)/comment/(:letter)
或者
/user/(:letter)
或者
/(:letter)
所以,我不能依赖^
和$
问题是,它不能按预期工作===
这匹配数字和字母,这是不可取的。我只关心字母。
我希望它能够匹配 only A-Za-z
,而不是数字和其他任何东西,因为 URI 变量必须只包含字母。
为了演示实际问题,
$pattern = '~/post/(:letter)/commentid/(:letter)/replyid/(:letter)~';
$pattern = str_replace('(:letter)', '[A-Za-z]+', $pattern);
$uri = '/post/foo/commentid/someid/replyid/someanotherid';
preg_match($pattern, $uri, $matches);
print_r($matches); // Success
现在看看这个:
$uri = '/post/foo123/commentid/someid123/replyid/someanotherid123';
preg_match($pattern, $uri, $matches);
print_r($matches); // Also success, I don't want this!
如您所见,这是不可取的,因为变量 ,
foo123
,someid123
也someanotherid123
包含数字。
问题是,
$magic_regex = 'What should it be to match exactly [A-Za-z] at any position?';
$pattern = str_replace('(:letter)', $magic_regex, $pattern);