从 PHP 中的字符串中获取所有 @ 提到的用户数据的正则表达式

Regular expression to fetch all @ mentioned user data from a string in PHP

我有以下字符串。该字符串包含提到的三个用户的数据 (@[ID:username__FULLNAME])。我想提取它们。我试过下面的代码但没有得到想要的结果。

ID is integer type
username and FULLNAME may contain numbers, letter and all kind of special chars.


$t = 'Hi @[4232:mark__MΛRK ATTLEY] how are you ? 
    Hi @[4232:ryan__RYΛN вυηту] how are you ? 
    Hi @[4232:david__DΛVID शाहिद ] how are you ? 
    ';

我的 PHP 代码:

$pattern = "|(?:(@\[[0-9]+:[\s\S(?!\])]+\]*))|";
preg_match_all($pattern, $string, $mentionList, PREG_PATTERN_ORDER);
print_r($mentionList);

当前结果:

Array
(
    [0] => Array
        (
            [0] => @[4232:mark__MΛRK ATTLEY] how are you ? 
    Hi @[4232:ryan__RYΛN вυηту] how are you ? 
    Hi @[4232:david__DΛVID शाहिद] how are you ? 

        )

    [1] => Array
        (
            [0] => @[4232:mark__MΛRK ATTLEY] how are you ? 
    Hi @[4232:ryan__RYΛN вυηту] how are you ? 
    Hi @[4232:david__DΛVID शाहिद] how are you ? 

        )

)

预期结果:

Array
(
    [0] => Array
        (
            [0] => @[4232:mark__MΛRK ATTLEY]
            [1] => @[4232:ryan__RYΛN вυηту]
            [2] => @[4232:david__DΛVID शाहिद ]
        )

)

有人可以帮助我获得想要的结果吗?

谢谢。

您可以将此正则表达式用于 3 个捕获组:

/@\[(\d+):(\S+)\h+(\S+)\h*\]/

RegEx Demo

正则表达式解释:

  • @:匹配文字@
  • \[:匹配文字[
  • (\d+):匹配 1+ 个数字并将其捕获到第 1 组中 id
  • ::匹配文字:
  • (\S+):匹配 1+ 个非空白字符并将其捕获到组 #2 中 firstName
  • \h+:匹配1个或多个水平空格
  • (\S+):匹配 1+ 个非空白字符并将其捕获到组 #3 中 lastName
  • \h*:匹配0个或多个水平空格
  • \]:匹配文字]

您可以使用以下正则表达式:@\[.+\] (demo) 得到您在 [] 中的所有内容加上前面的 @.

检查这个工作php demo

不确定这是否会为您提供您正在寻找的确切输出,但您的正则表达式有点太贪婪了。您可以这样简化它:(?:@\[[0-9]+.+?])

这应该 return 分别捕获组。

不确定是否需要匿名捕获组,因此可以将其简化为 (@\[[0-9]+.+?]) 甚至 (@\[.+?])