从 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*\]/
正则表达式解释:
@
:匹配文字@
\[
:匹配文字[
(\d+)
:匹配 1+ 个数字并将其捕获到第 1 组中 id
:
:匹配文字:
(\S+)
:匹配 1+ 个非空白字符并将其捕获到组 #2 中 firstName
\h+
:匹配1个或多个水平空格
(\S+)
:匹配 1+ 个非空白字符并将其捕获到组 #3 中 lastName
\h*
:匹配0个或多个水平空格
\]
:匹配文字]
您可以使用以下正则表达式:@\[.+\]
(demo) 得到您在 []
中的所有内容加上前面的 @
.
检查这个工作php demo
不确定这是否会为您提供您正在寻找的确切输出,但您的正则表达式有点太贪婪了。您可以这样简化它:(?:@\[[0-9]+.+?])
这应该 return 分别捕获组。
不确定是否需要匿名捕获组,因此可以将其简化为 (@\[[0-9]+.+?])
甚至 (@\[.+?])
。
我有以下字符串。该字符串包含提到的三个用户的数据 (@[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*\]/
正则表达式解释:
@
:匹配文字@
\[
:匹配文字[
(\d+)
:匹配 1+ 个数字并将其捕获到第 1 组中id
:
:匹配文字:
(\S+)
:匹配 1+ 个非空白字符并将其捕获到组 #2 中firstName
\h+
:匹配1个或多个水平空格(\S+)
:匹配 1+ 个非空白字符并将其捕获到组 #3 中lastName
\h*
:匹配0个或多个水平空格\]
:匹配文字]
您可以使用以下正则表达式:@\[.+\]
(demo) 得到您在 []
中的所有内容加上前面的 @
.
检查这个工作php demo
不确定这是否会为您提供您正在寻找的确切输出,但您的正则表达式有点太贪婪了。您可以这样简化它:(?:@\[[0-9]+.+?])
这应该 return 分别捕获组。
不确定是否需要匿名捕获组,因此可以将其简化为 (@\[[0-9]+.+?])
甚至 (@\[.+?])
。