You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计任意页面中的所有嵌入链接?附站内外链接统计代码解析

嘿,针对你这个页面嵌入链接统计的需求,结合你提供的Yii后端方法和jQuery前端代码,我来给你拆解清楚每部分的逻辑、用法以及优化建议:

一、需求核心概述

咱们的目标是:抓取任意页面内所有<a>标签的嵌入链接,精准区分站内链接(inbound)和站外链接(outbound),最终返回结构化的统计结果。

二、后端Yii框架实现解析

先看你提供的actionPagelink()方法,我给你拆解关键逻辑:

public function actionPagelink()
{
    // 接收前端传递的链接列表
    $links = Yii::$app->request->post('links');
    if (empty($links)) {
        return json_encode(['status' => 'error', 'message' => 'No links provided']);
    }

    $inboundCount = 0;
    $outboundCount = 0;
    // 获取当前站点的根域名,这是区分站内/站外的核心依据
    $siteDomain = parse_url(Yii::$app->request->hostInfo, PHP_URL_HOST); 

    foreach ($links as $link) {
        // 跳过空链接、锚点链接(这类链接不属于跳转链接,无需统计)
        if (empty($link) || str_starts_with($link, '#')) {
            continue;
        }

        // 非http开头的相对路径,直接判定为站内链接
        if (!str_starts_with($link, 'http')) {
            $inboundCount++;
            continue;
        }

        // 解析外部链接的域名,和站点域名对比
        $linkDomain = parse_url($link, PHP_URL_HOST);
        if ($linkDomain === $siteDomain) {
            $inboundCount++;
        } else {
            $outboundCount++;
        }
    }

    // 返回标准JSON格式结果,方便前端处理
    return json_encode([
        'status' => 'success',
        'data' => [
            'inbound' => $inboundCount,
            'outbound' => $outboundCount
        ]
    ]);
}

关键细节说明:

  • 请求校验:先判断前端是否传递了有效链接列表,避免空请求导致的错误
  • 域名判定:用parse_url提取站点域名,这是最可靠的站内/站外区分方式
  • 特殊链接过滤:自动跳过空链接、锚点链接,避免无效统计
  • 返回格式:统一用带状态码的JSON返回,前端可以轻松判断请求是否成功
三、前端jQuery实现解析

再看前端收集链接的jQuery代码,核心是抓取页面所有<a>标签的href属性:

$(document).ready(function() {
    // 初始化数组存储所有链接
    var links = [];
    // 遍历页面所有<a>标签
    $('a').each(function() {
        var href = $(this).attr('href');
        // 过滤空href的无效标签,同时去除首尾空格
        if (href) { 
            links.push(href.trim());
        }
    });

    // 发送链接列表到后端统计接口
    $.ajax({
        url: '/controller/pagelink', // 替换为你的Yii控制器实际路由
        type: 'POST',
        data: { links: links },
        dataType: 'json',
        success: function(response) {
            if (response.status === 'success') {
                // 控制台打印结果,也可以渲染到页面DOM中
                console.log('站内链接数量:' + response.data.inbound);
                console.log('站外链接数量:' + response.data.outbound);
                // 示例:把结果渲染到页面的#result容器里
                $('#result').html(`
                    <p>站内链接:${response.data.inbound} 个</p>
                    <p>站外链接:${response.data.outbound} 个</p>
                `);
            } else {
                console.error('统计失败:' + response.message);
            }
        },
        error: function(xhr, status, error) {
            console.error('请求接口失败:' + error);
        }
    });
});

关键细节说明:

  • 链接收集:遍历所有<a>标签,过滤空值并做格式化处理,避免无效数据
  • AJAX请求:用POST方式传递链接数组,指定dataType: 'json'让jQuery自动解析返回结果
  • 结果处理:成功时可以把统计结果渲染到页面,失败时打印错误信息方便排查
四、使用注意事项与优化建议
  1. 路由配置:前端AJAX的url要对应你的Yii控制器路由,比如控制器是SiteController,则路由应为/site/pagelink,也可以用Yii的Url::to(['site/pagelink'])生成绝对路径
  2. 跨域问题:如果要统计其他域名的页面,前端直接抓取会触发跨域限制,建议改用后端爬虫(比如PHP的Guzzle库)先获取页面内容,再解析链接
  3. 链接去重:当前代码会统计重复链接,如果需要统计唯一链接数量,可以在前端用[...new Set(links)]去重,或者后端用array_unique($links)处理
  4. 子域名兼容:如果需要把子域名视为站内链接,可以修改域名判断逻辑为str_ends_with($linkDomain, '.' . $siteDomain)
  5. 特殊链接过滤:可以在前端额外过滤javascript:、mailto:这类伪协议链接,比如添加判断!href.startsWith('javascript:') && !href.startsWith('mailto:')
五、常见问题排查
  • 后端返回空数据:检查前端是否正确传递了links参数,或者页面中是否存在<a>标签;同时确认Yii::$app->request->hostInfo是否正确获取了站点域名
  • AJAX请求404:确认Yii的URL管理器配置正确,是否开启了美化URL,或者直接使用绝对路径发起请求
  • 统计结果不准确:检查是否有未被过滤的特殊链接,比如伪协议链接、相对路径拼接错误的情况

内容的提问来源于stack exchange,提问作者Rajan Chaulagain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:09:02