全方位站长技能、SEO优化学习平台
当前位置:网站首页 > PHP笔记 > 正文

PHP教程:文章中外链跳转处理教程

作者:文煞发布时间:2024-09-13分类:PHP笔记浏览:200


温馨提示:手机扫码可阅读当前文章!
文章简介:很多CMS系统都采用PHP程序与主题模板分离的方法来实现页面的高度自定义,我们通常只需要修改模板文件就可以达到一些想要的功能。在面对大量采集的内容,站长很难保证采集得来的文章内容全都干净合法,一不小心就会采集到一些乱七八糟的外部超链接,如果...

很多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的意思。

PHP教程:文章中外链跳转处理教程  第1张

我们可以修改第一部分代码来达到想要的效果,我们可以把{$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代码,否则会出现禁止跳转的相关提示词!


欢迎您,来自美国–俄亥俄州–特拉华县–都柏林的朋友,您的IP:18.188.68.115,您的网络:Amazon数据中心


PHP笔记排行
随机推荐
猜你喜欢

服务热线

1888888888

要发发发发发发

站长微信公众号

站长微信公众号

分享:

支付宝

微信