如何在随机位置精确匹配[A-Za-z]?

时间:2013-06-17 16:00:46

标签: php regex

我正在建立一个路线系统,并且需要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!

正如您所看到的,这是不可取的,因为变量, foo123someid123someanotherid123也包含数字。

问题是,

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

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

3 个答案:

答案 0 :(得分:1)

您可以在每次替换时附加前瞻声明:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你试过吗? $pattern = /[a-zA-Z]/g