很多CMS系统都采用PHP程序与主题模板分离的方法来实现页面的高度自定义,我们通常只需要修改模板文件就可以达到一些想要的功能。在面对大量采集的内容,站长很难保证采集得来的文章内容全都干净合法,一不小心就会采集到一些乱七八糟的外部超链接,如果我们能在文章内容展示给用户之前,对文章内容进行处理,未尝不是一件美事。
一、修改PHP文件或者插件来进行处理
对于市面常见的CMS系统可以修改文件或者使用插件的方法对文章内容进行处理,修改PHP文件的话可能会导致升级以后失效,建议使用插件的方式来进行处理,由于本人也不熟悉所有程序的插件钩子机制,所以这里无法使用完整的插件代码来进行展示。我们分享处理文章内容的核心功能代码吧:
<?php
// 假设$content是从数据库或者某个地方获取的文章内容
$content = "<p>This is an example article with a link to Example Site.</p >";
// 正则表达式来匹配所有的超链接
$pattern = '/<a\s+(?:[^>]*?\s+)?href="([^"]*)"/i';
// 检查是否存在外部链接
if (preg_match($pattern, $content, $matches)) {
// 检查链接是否是外部链接
$url = $matches[1];
$domain = parse_url($url, PHP_URL_HOST);
$current_domain = parse_url('http://'.$_SERVER['HTTP_HOST'], PHP_URL_HOST);
if ($domain !== $current_domain) {
// 替换所有的外部链接,添加JavaScript事件处理
$content = preg_replace($pattern, '<a href="$1" onclick="return confirmLink(this);">', $content);
// 添加JavaScript代码
$content .= <<<JS
<script>
function confirmLink(link) {
if (confirm('您即将跳转到外部链接,是否继续?')) {
return;
} else {
event.preventDefault(); // 阻止链接默认行为
return false;
}
}
</script>
JS;
}
}
// 输出处理后的文章内容
echo $content;
?>这段PHP代码首先定义了一个正则表达式来匹配文章中的所有超链接。如果找到超链接,它会检查链接是否指向当前网站的外部。如果是外部链接,它将使用preg_replace函数将所有的<a>标签的onclick事件替换为一个自定义的confirmLink函数,这个函数会弹出一个确认对话框。
在PHP代码的最后,我们输出了处理后的文章内容,并在文章内容下方添加了JavaScript代码,该代码定义了confirmLink函数,用于在点击链接时显示确认对话框。当用户点击确认以后,才会进行跳转。这样利于外部内容的风险对你网站的影响以及阻止权重的流失。
以上代码可用于你在处理该类事件时,对修改和系统PHP文件或者设计插件的时候进行完善并使用。
二、修改模板文件来进行处理
我知道在dz和zblog在模板中都可以运行PHP代码,至于其他的CMS系统就不怎么了解了。
下面我以zblog为例吧,zblog文章内容页的模板文件是post-sing.php,你可以在该文件找到以下代码:{$article.Content},该代码就是输出对象$article->Content的意思。

我们可以修改第一部分代码来达到想要的效果,我们可以把{$article.Content}替换为如下代码:
{php}
// 假设$content是从数据库或者某个地方获取的文章内容
$content = $article->Content;
// 正则表达式来匹配所有的超链接
$pattern = '/<a\s+(?:[^>]*?\s+)?href="([^"]*)"/i';
// 检查是否存在外部链接
if (preg_match($pattern, $content, $matches)) {
// 检查链接是否是外部链接
$url = $matches[1];
$domain = parse_url($url, PHP_URL_HOST);
$current_domain = parse_url('http://'.$_SERVER['HTTP_HOST'], PHP_URL_HOST);
if ($domain !== $current_domain) {
// 替换所有的外部链接,添加JavaScript事件处理
$content = preg_replace($pattern, '<a href="$1" onclick="return confirmLink(this);">', $content);
// 添加JavaScript代码
$content .= <<<JS
<script>
function confirmLink(link) {
if (confirm('您即将跳转到外部链接,是否继续?')) {
return;
} else {
event.preventDefault(); // 阻止链接默认行为
return false;
}
}
</script>
JS;
}
}
// 输出处理后的文章内容
echo $content;
{/php}在zblog的模板文件中,PHP代码放在{php}和{/php}之间,就可以运行模板文件中的PHP代码了。其他CMS系统可能有差异,需要你根据自己使用的内容管理系统来进行优化。
三、设置白名单+中间页的跳转方法
在一、二段文字中,我们介绍了外部链接提示处理的基础功能,我们下面可以进行进一步深化处理,比如设置允许跳转的域名则通过JS来进行跳转。
<?php
// 示例文章内容
$content = "这是一段内容非常丰富的文章内容";
// 使用正则表达式匹配所有的超链接
$pattern = '/<a\s+(?:[^>]*?\s+)?href="([^"]*)"/i';
// 检测文章中是否含有超链接,并获取所有匹配项
if (preg_match_all($pattern, $content, $matches)) {
// 获取所有匹配到的超链接
$urls = $matches[1];
// 遍历所有匹配到的超链接,并替换它们
foreach ($urls as $index => $url) {
// 创建新的URL格式
$newUrl = "go.php?url=" . urlencode($url);
// 替换文章中的原始URL
$content = str_replace($url, $newUrl, $content);
}
}
// 输出处理后的文章内容
echo $content;
?>这代段代码把原文章中的超链接的URL全部替换为go.php?url=原URL的格式,然后通过中间页来进行处理。中间页(go.php)的代码:
<?php
// go.php
$redirect_url = isset($_GET['url']) ? $_GET['url'] : ''; // 从GET参数获取URL
// 允许跳转的域名列表
$allowed_domains = ['www.bbb.com', 'www.ccc.com'];
// 检查URL格式是否正确
if (!filter_var($redirect_url, FILTER_VALIDATE_URL)) {
die('非法操作:URL格式不正确。');
}
// 获取URL的主机名
$host = parse_url($redirect_url, PHP_URL_HOST);
// 检查是否允许跳转的域名
if (!in_array($host, $allowed_domains)) {
die('非法操作:不允许的域名。');
}
// 安全措施:清理URL以防止XSS攻击
$redirect_url = filter_var($redirect_url, FILTER_SANITIZE_URL);
// 跳转延迟时间(秒)
$redirect_delay = 5;
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>页面跳转</title>
<script>
var countdown = <?php echo $redirect_delay; ?>;
function updateCountdown() {
countdown--;
document.getElementById('countdown').innerText = '跳转中 (' + countdown + '秒)';
if (countdown <= 0) {
window.location.href = '<?php echo $redirect_url; ?>';
} else {
setTimeout(updateCountdown, 1000);
}
}
</script>
</head>
<body>
<div style="text-align: center; margin-top: 100px;">
<h1>即将跳转</h1>
<p id="countdown">跳转中 (<?php echo $redirect_delay; ?>秒)</p>
<p><a href="<?php echo $redirect_url; ?>">立即跳转</a></p>
</div>
<script>
window.onload = function() {
updateCountdown();
};
</script>
</body>
</html>这段代码通抓取GET信息获取需要跳转的URL,然后判断是否运行跳转,如果属于运行跳转的URL,才会执行跳转的JS代码,否则会出现禁止跳转的相关提示词!








