用于@ [提及]的PHP正则表达式

时间:2012-08-18 02:05:32

标签: php regex

有人可以帮助我:

$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。

2 个答案:

答案 0 :(得分:6)

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

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

请注意我添加的\\[?\\]?;这些符合[]个字符,如果没有[],也会匹配。

请注意,上述内容将与@[14256@14256]相匹配。如果你只想匹配一个或另一个,你需要做一点不同。

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

这将与@aA1 @[aA1]相匹配,但不会与上面显示的错误示例相符。

要包含的最后一件事:此正则表达式只匹配@[mention]的一个实例。如果你想匹配它的所有实例(例如“嘿@ 123,这些天如何@ 456?”),请在preg_match_all()中使用以下内容:

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

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

答案 1 :(得分:0)

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

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