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