php实现@
PHP 实现 @ 功能
在 PHP 中实现类似社交平台的 @ 功能,通常涉及用户提及、通知处理和文本解析。以下是实现的关键步骤:
解析文本中的 @ 用户名
使用正则表达式匹配文本中的 @ 符号及紧随的用户名。以下是一个示例代码片段:
$text = "Hello @user1 and @user2, check this out!";
preg_match_all('/@(\w+)/', $text, $matches);
$mentionedUsers = $matches[1]; // 获取被提及的用户名数组
验证用户存在
检查被提及的用户是否存在于数据库中:
foreach ($mentionedUsers as $username) {
$user = $db->query("SELECT id FROM users WHERE username = ?", [$username])->fetch();
if ($user) {
$validUsers[] = $user['id'];
}
}
存储提及关系
将提及信息存储到数据库,便于后续生成通知:
$postId = 123; // 假设这是当前帖子或评论的ID
foreach ($validUsers as $userId) {
$db->query("INSERT INTO mentions (post_id, user_id) VALUES (?, ?)", [$postId, $userId]);
}
发送通知
通过系统消息或邮件通知被提及的用户:
foreach ($validUsers as $userId) {
$notification = "你被提及在帖子中: " . $postId;
$db->query("INSERT INTO notifications (user_id, message) VALUES (?, ?)", [$userId, $notification]);
}
前端高亮显示
使用 JavaScript 或 CSS 高亮显示 @ 用户名:
// 使用 jQuery 示例
$('.post-content').html(function(_, html) {
return html.replace(/@(\w+)/g, '<span class="mention">@$1</span>');
});
数据库设计
建议的数据库表结构:
-
mentions表:存储提及关系id(主键)post_id(被提及的内容ID)user_id(被提及的用户ID)created_at(时间戳)
-
notifications表:存储用户通知id(主键)user_id(接收用户ID)message(通知内容)is_read(是否已读)created_at(时间戳)
性能优化
对于高频使用的场景,可以考虑:
- 使用缓存存储用户名字典,减少数据库查询
- 批量处理通知发送,避免频繁的数据库写入
- 使用消息队列处理通知分发
安全考虑
- 对用户输入进行过滤,防止 XSS 攻击
- 限制单个内容中 @ 的数量,防止滥用
- 实施频率限制,避免恶意用户通过 @ 骚扰他人







