在开发社交类PHP应用时,用户内容中的@提及(艾特)功能是常见需求。但如果不加以限制,可能会导致性能问题和安全风险。本文将介绍几种高效控制艾特解析次数和数量的方法。
// 限制最多解析5个@提及
function parseMentions($content) {
$count = 0;
$maxMentions = 5;
return preg_replace_callback('/@([\w\-]+)/',
function($matches) use (&$count, $maxMentions) {
if ($count++ < $maxMentions) {
return '<a href="/user/'.$matches[1].'">@'.$matches[1].'</a>';
}
return $matches[0];
},
$content);
}
在解析前先统计@数量,超过阈值则拒绝处理或截断:
function countMentions($content) {
preg_match_all('/@[\w\-]+/', $content, $matches);
return count($matches[0]);
}
$mentionCount = countMentions($userContent);
if ($mentionCount > 10) {
// 返回错误或截断处理
}
对于频繁出现的相同内容,可以使用缓存避免重复解析:
function getCachedMentions($content) {
$cacheKey = 'mention_'.md5($content);
if ($cached = apc_fetch($cacheKey)) {
return $cached;
}
$parsed = parseMentions($content);
apc_store($cacheKey, $parsed, 3600);
return $parsed;
}
在存储前验证@数量:
// 使用触发器或存储过程
CREATE TRIGGER check_mentions BEFORE INSERT ON posts
FOR EACH ROW
BEGIN
DECLARE mention_count INT;
SET mention_count = (SELECT LENGTH(NEW.content) - LENGTH(REPLACE(NEW.content, '@', '')));
IF mention_count > 15 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Too many mentions';
END IF;
END;
结合JavaScript在前端先行验证:
// JavaScript验证
function validateMentions(text) {
const mentions = text.match(/@\w+/g) || [];
return mentions.length <= 8;
}
// 提交前检查
form.addEventListener('submit', (e) => {
if (!validateMentions(textarea.value)) {
e.preventDefault();
alert('最多只能@8个用户');
}
});
通过以上方法,可以有效控制PHP应用中@提及功能的解析负载,平衡功能需求和系统性能。