You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何提取@提及的用户名到数组以实现通知功能?

提取@提及的用户名到数组的解决方案

嘿,我来帮你搞定这个需求!你现在需要从文本里提取所有被@标记的用户名并存入数组,用PHP的preg_match_all()就能轻松实现,这比单纯的替换更适合捕获所有匹配结果。

核心实现代码

直接上可以运行的示例:

<?php
$text = 'Hey @Mathew, have u talked with @Jhon today?';
// 使用preg_match_all捕获所有符合规则的用户名
preg_match_all('/(^|\s)@([A-Za-z0-9]+)/', $text, $matches);
// 从匹配结果中取出用户名数组
$mentionedUsers = $matches[2];

// 打印结果验证
print_r($mentionedUsers);
// 输出:Array ( [0] => Mathew [1] => Jhon )
?>

关键细节说明

  • 正则表达式优化:我把原正则里的*改成了+,这样可以避免捕获空用户名(比如单独的@符号),确保只提取有效的、至少包含一个字符的用户名。
  • 匹配结果解析:preg_match_all()返回的$matches数组里,$matches[0]是完整的匹配字符串(比如" @Mathew"),$matches[1]是第一个捕获组(空格或字符串开头),而$matches[2]就是我们需要的纯用户名部分。
  • 兼容边界场景:这个正则会自动忽略用户名后面的标点(比如示例里的@Mathew,),因为逗号不属于[A-Za-z0-9]的范围,所以能精准提取到Mathew。

同时保留替换逻辑

如果需要同时完成“提取用户名”和“替换成链接”两个操作,也可以无缝结合:

<?php
$text = 'Hey @Mathew, have u talked with @Jhon today?';

// 第一步:提取用户名
preg_match_all('/(^|\s)@([A-Za-z0-9]+)/', $text, $matches);
$mentionedUsers = $matches[2];

// 第二步:替换为链接
$text = preg_replace('/(^|\s)@([A-Za-z0-9]+)/', '\1<a href="profile.php?user=\\2">@\\2</a>', $text);

// 现在$mentionedUsers是目标数组,$text是处理后的HTML文本
?>

内容的提问来源于stack exchange,提问作者Kloves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:17:52