php实现@
PHP 实现 @ 功能(如用户提及或通知)
在 PHP 中实现类似社交平台的 @ 功能(用户提及或通知),需要结合字符串处理、数据库查询和事件触发逻辑。以下是关键实现步骤:
解析文本中的 @ 用户名
使用正则表达式匹配文本中的 @ 符号及后续用户名。例如匹配 @username 格式:
$text = "Hello @alice, check this out!";
preg_match_all('/@(\w+)/', $text, $matches);
$mentionedUsers = $matches[1]; // 获取 ['alice']
正则说明:
@匹配 @ 符号。(\w+)捕获一个或多个字母、数字或下划线(可根据需求调整字符范围)。
验证用户是否存在
查询数据库验证被提及的用户名是否有效:
// 假设使用 PDO 连接数据库
$stmt = $pdo->prepare("SELECT id FROM users WHERE username = ?");
foreach ($mentionedUsers as $username) {
$stmt->execute([$username]);
if ($user = $stmt->fetch()) {
$validUsers[] = $user['id']; // 存储有效用户ID
}
}
发送通知或存储提及记录
将提及记录插入数据库通知表或触发通知事件:
// 示例:插入通知表
$notificationContent = "You were mentioned by @{$currentUser}";
foreach ($validUsers as $userId) {
$stmt = $pdo->prepare(
"INSERT INTO notifications (user_id, content, created_at)
VALUES (?, ?, NOW())"
);
$stmt->execute([$userId, $notificationContent]);
}
前端高亮显示 @ 用户
使用 JavaScript 或 CSS 对前端渲染的文本中的 @ 用户名进行高亮:
// 使用正则替换为带样式的 HTML
const text = "Hello @alice";
const highlighted = text.replace(/@(\w+)/g, '<span class="mention">@$1</span>');
CSS 样式示例:
.mention {
color: #1da1f2;
font-weight: bold;
}
性能优化建议
- 批量查询用户:将
$mentionedUsers数组通过IN子句一次性查询,避免循环内多次查询数据库。 - 缓存用户数据:使用缓存(如 Redis)存储用户名与 ID 的映射关系,减少数据库压力。
- 异步处理通知:通过消息队列(如 RabbitMQ)异步发送通知,提升响应速度。
完整示例代码
function processMentions($text, $currentUserId) {
global $pdo;
// 匹配 @ 用户名
preg_match_all('/@(\w+)/', $text, $matches);
if (empty($matches[1])) return;
// 批量查询有效用户
$placeholders = rtrim(str_repeat('?,', count($matches[1])), ',');
$stmt = $pdo->prepare(
"SELECT id, username FROM users WHERE username IN ($placeholders)"
);
$stmt->execute($matches[1]);
$validUsers = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 插入通知
$notificationStmt = $pdo->prepare(
"INSERT INTO notifications (user_id, content, created_at)
VALUES (?, ?, NOW())"
);
foreach ($validUsers as $user) {
$content = "You were mentioned by user ID: $currentUserId";
$notificationStmt->execute([$user['id'], $content]);
}
}
通过以上步骤,可实现基础的 @ 提及功能,并根据实际需求扩展权限检查、通知链接等细节。







