3

我正在构建一个路线系统,并且需要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,someid123someanotherid123包含数字。

问题是,

$magic_regex = 'What should it be to match exactly [A-Za-z] at any position?';

$pattern = str_replace('(:letter)', $magic_regex, $pattern);
4

3 回答 3

1

您给出的问题示例实际上不是问题:它不匹配,因为字符串中的[A-Za-z]+正则表达式后跟。你可能在最后一个位置有问题。您只需要在末尾添加类似或的内容。/$pattern$([?].*)?$

于 2013-06-17T16:14:51.803 回答
1

您可以在每次替换时附加一个前瞻断言:

$pattern = str_replace('(:letter)', '[A-Za-z]+(?=/|$)', $pattern);

断言匹配斜杠或 URI 的结尾。

于 2013-06-17T16:03:29.160 回答
0

你有没有尝试过 $pattern = /[a-zA-Z]/g

于 2013-06-17T16:24:05.580 回答