我正在建立一个路线系统,并且需要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);
答案 0 :(得分:1)
您可以在每次替换时附加前瞻声明:
$pattern = str_replace('(:letter)', '[A-Za-z]+(?=/|$)', $pattern);
断言匹配斜杠或URI的结尾。
答案 1 :(得分:1)
您提供的问题示例实际上不是问题:它不匹配,因为[A-Za-z]+
字符串中的/
正则表达式后跟$pattern
。你可能在最后一个位置遇到问题。您只需在最后添加$
或([?].*)?$
等内容。
答案 2 :(得分:0)
你试过吗?
$pattern = /[a-zA-Z]/g