如何在任意位置精确匹配[A-Za-z]


How to exactly match [A-Za-z] at random position?

我正在构建一个路由系统,需要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