Php 从字符串开始时,从字符串中获取所有片段@

Php 从字符串开始时,从字符串中获取所有片段@,php,regex,Php,Regex,当word以@开头,然后只包含alnym0-9a-z字符时,我需要获取字符串中的所有匹配项。例如,从这个字符串@ww@eex@vx@ss@aa assadd@sfsd我需要这些东西: @ss @aa @sfsd 我正在努力: $str = "@ww@ee x@@vx @ss @aa assadd @sfsd"; preg_match_all("#(^|\s)\@([0-9a-z]+)(\s+|$)#ui", $str, $matches); var_dump( $mat

当word以
@
开头,然后只包含alnym
0-9a-z
字符时,我需要获取字符串中的所有匹配项。例如,从这个字符串
@ww@eex@vx@ss@aa assadd@sfsd
我需要这些东西:

@ss
@aa
@sfsd

我正在努力:

    $str = "@ww@ee  x@@vx @ss @aa assadd @sfsd";
    preg_match_all("#(^|\s)\@([0-9a-z]+)(\s+|$)#ui", $str, $matches);
    var_dump( $matches );
但这只给出了
@ss
@sfsd
和跳过
@aa


什么样的模式才是正确的呢?

您可以使用以下正则表达式

'~\B(?<!@)@([0-9a-z]+)(?:\s|$)~iu'

“~\B(?我想你需要的就是。再见,非常感谢你,这个works@WiktorStribiżew请将此作为一个答案发布,并详细说明其工作原理。这将非常有帮助。好的,让我发布解释。
$re = '~\B(?<!@)@([0-9a-z]+)(?:\s|$)~ui'; 
$str = "@ww@ee  x@@vx @ss @aa assadd @sfsd"; 
preg_match_all($re, $str, $matches);
print_r($matches);