php 实现 at用户
PHP 实现 @用户 功能
获取用户输入内容
从表单或 API 获取包含 @ 符号的用户输入内容,例如评论或消息。
$content = $_POST['content']; // 假设从表单获取内容
正则匹配 @用户名
使用正则表达式匹配内容中的 @ 用户名,格式通常为 @username。
preg_match_all('/@([a-zA-Z0-9_]+)/', $content, $matches);
$usernames = $matches[1]; // 提取匹配到的用户名数组
查询用户信息
根据匹配到的用户名查询数据库,验证用户是否存在并获取用户 ID 等信息。
// 假设使用 PDO 连接数据库
$stmt = $pdo->prepare("SELECT id FROM users WHERE username = ?");
foreach ($usernames as $username) {
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user) {
// 用户存在,记录用户 ID
$mentionedUsers[] = $user['id'];
}
}
替换为可点击链接
将 @username 替换为 HTML 链接,指向用户个人主页或触发其他动作。

foreach ($usernames as $username) {
$content = str_replace(
"@$username",
"<a href='/profile/$username'>@$username</a>",
$content
);
}
发送通知
为被 @ 的用户发送通知,可以通过数据库、邮件或即时消息实现。
// 假设有一个通知表
foreach ($mentionedUsers as $userId) {
$stmt = $pdo->prepare("INSERT INTO notifications (user_id, message) VALUES (?, ?)");
$stmt->execute([$userId, "You were mentioned in a post"]);
}
存储处理后的内容
将处理后的内容存储到数据库或返回给前端。
$stmt = $pdo->prepare("INSERT INTO posts (content) VALUES (?)");
$stmt->execute([$content]);
前端展示
确保前端正确渲染 HTML 链接,并为 @ 用户提供悬停效果或其他交互。

<div class="post-content">
<?php echo $content; ?>
</div>
安全性考虑
对用户输入进行过滤和转义,防止 XSS 攻击。
$content = htmlspecialchars($content, ENT_QUOTES, 'UTF-8');
性能优化
对于高频使用的场景,可以考虑缓存用户查询结果或使用更高效的正则表达式。
// 使用预编译语句和批量查询优化性能
$stmt = $pdo->prepare("SELECT id, username FROM users WHERE username IN (?)");
$stmt->execute([implode(',', $usernames)]);
$users = $stmt->fetchAll();
测试与验证
编写单元测试验证正则匹配、用户查询和替换逻辑的正确性。
// 示例测试用例
$testContent = "Hello @user1 and @user2";
preg_match_all('/@([a-zA-Z0-9_]+)/', $testContent, $testMatches);
assert(count($testMatches[1]) === 2);






