我正在构建一个路由系统,需要URI segment
变量,它与[A-Za-z]
完全匹配
非常重要的是要注意,变量可以在任何位置(不仅在开始或结束),
例如,这可以是
/post/(:letter)/comment/(:letter)
或
/user/(:letter)
或
/(:letter)
所以,我不能依赖^
和$
问题是,它不像预期的那样工作===
这匹配数字和字母,这是不希望的。我只关心字母。
我希望这只能够匹配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);
您可以在每次替换时附加预先查找断言:
$pattern = str_replace('(:letter)', '[A-Za-z]+(?=/|$)', $pattern);
断言匹配斜杠或URI的结尾。
您给出的问题示例实际上不是问题:它不匹配,因为[A-Za-z]+
正则表达式后面跟着$pattern
字符串中的/
。你上一个职位可能有问题。您只需要在末尾添加$
或([?].*)?$
。
你试过了吗$pattern = /[a-zA-Z]/g