有人能帮我吗:
$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 。
您需要在正则表达式中包含括号:
"/^(?:[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]将同时包含123和456。
您需要转义正则表达式中的括号,以免它们被解释为新的字符类。试试这个(它只会捕获数字,而不是括号。将转义的括号放在括号中以将它们捕获为反向引用的一部分):
$pattern = "/^(?:[a-zA-Z0-9?. ]?)+@\[([a-zA-Z0-9]+)\](.+)?$/";