0

我有以下字符串。该字符串包含提到的三个用户的数据 (@[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 शाहिद ]
        )

)

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

谢谢。

4

3 回答 3

1

您可以将此正则表达式与 3 个捕获的组一起使用:

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

正则表达式演示

正则表达式解释:

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

您可以使用以下正则表达式:(@\[.+\]demo 它可以让您拥有一切[]以及 front @

检查这个工作php 演示

于 2018-01-18T11:27:26.420 回答
1

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

这应该分别返回捕获的组。

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

于 2018-01-18T11:27:59.390 回答