0

有人能帮我吗:

$pattern = "/^(?:[a-zA-Z0-9?. ]?)+@([a-zA-Z0-9]+)(.+)?$/";
$str = "Hey @[14256] hey how are you?";
preg_match($pattern, $title, $matches);
print_r($matches);

如果我删除@提及的括号(@ [14256]),打印结果可以正常工作,但是我无法弄清楚如何使用正则表达式来处理括号。所以我会在我的数组中得到结果 14256 。

4

2 回答 2

7

您需要在正则表达式中包含括号:

"/^(?:[a-zA-Z0-9?. ]?)+@(\\[?[a-zA-Z0-9]+\\]?)(.+)?$/"

注意我添加\\[?的;\\]?这些将匹配[]字符,如果没有[].

请记住,以上将匹配@[14256@14256]。如果你只想匹配一个或另一个,你需要做一些不同的事情。

"/^(?:[a-zA-Z0-9?. ]?)+@([a-zA-Z0-9]+|\\[[a-zA-Z0-9]+\\])(.+)?$/"

这将匹配 EITHER@aA1 @[aA1],但不是我上面展示的坏例子。

最后要包括的一件事:此正则表达式将仅匹配@[mention]. 如果您想匹配它的所有实例(例如“嘿@123,这些天@456 怎么样? ”),请使用以下内容preg_match_all()

"/@([a-zA-Z0-9]+|\\[[a-zA-Z0-9]+\\])/"

然后$matches[1]将同时包含123456

于 2012-08-18T02:09:01.387 回答
0

您需要转义正则表达式中的括号,以免它们被解释为新的字符类。试试这个(它只会捕获数字,而不是括号。将转义的括号放在括号中以将它们捕获为反向引用的一部分):

$pattern = "/^(?:[a-zA-Z0-9?. ]?)+@\[([a-zA-Z0-9]+)\](.+)?$/";
于 2012-08-18T02:10:00.830 回答