php动态高亮web源代码

news2024/11/24 16:56:25

php动态高亮web源代码

注:配置好不允许高亮的文件名,安全第一

#php实现动态展示目录树结构源代码

适用于开放源代码,结合html缓存使用效果更佳,因循环较多不适合放首页

能力有限没实现行号

演示:show source|开放源代码

效果截图

代码

4个文件放统一目录

1.php,1.html,net.js,showsource.php

1.php

<?php
header('Content-Type: text/html; charset=utf-8');

define('root',str_replace('\\','/',realpath(__DIR__.'/../..')));
$dir = root;
$res = [];
$root_dir = $dir;
$res = tree($res,$dir);
//$res = preg_replace('/^'.preg_quote($dir,'/').'/', 'root', $res);
$data = base64_encode(json_encode($res));
require '1.html';
function tree(&$res,$dir)
{
    global $root_dir;
    if(count($res)===0){
        $res[]=[
            'id'=>sha1($dir),
            'pid'=>0,
            'type'=>'dir',
            'handle'=>$dir,
            'name'=>substr($dir,strripos($dir,'/')+1,strlen($dir)),
        ];
    }
    $handles = array_merge(glob($dir . '/.*'), glob($dir . '/*'));
    $handles = preg_replace('/^[\s\S]*\/\.$/','',$handles);
    $handles = preg_replace('/^[\s\S]*\/\.\.$/','',$handles);
    $handles = array_filter($handles);
    sort($handles);
    foreach ($handles as $item){
        if(is_dir($item)){
            $res[]=[
                'id'=>sha1($item),
                'pid'=>sha1($dir),
                'type'=>'dir',
                'handle'=>preg_replace('/^'.preg_quote($root_dir,'/').'/','root',$item),
                'name'=>substr($item,strripos($item,'/')+1,strlen($item)),
            ];
            tree($res,$item);
        }else{
            $res[]=[
                'id'=>sha1($item),
                'pid'=>sha1($dir),
                'type'=>'file',
                'handle'=>preg_replace('/^'.preg_quote($root_dir,'/').'/','root',$item),
                'name'=>substr($item,strripos($item,'/')+1,strlen($item)),
            ];
        }
    }
    return $res;
}

function dump($s=null,$return = false)
{
    ob_start();
    var_dump($s);
    $res = ob_get_clean();
    $res = preg_replace('/'.preg_quote(']=>','/').'\n[\s]+/m', '] => ', $res);
    switch (php_sapi_name()){
        case 'cgi-fcgi':
            $res = preg_replace('/  /U', "\t", $res);
            $res = '<pre><code>'.$res.'</code></pre>';
            if($return)
                return $res;
            echo $res;
            break;
        case 'cli':
            if($return)
                return $res;
            echo $res;
            break;
    }
}

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>show source</title>
    <style>
        .tree {
            --spacing: 1.5rem;
            --radius: 10px;
            padding-left: 0;
            padding-right: 10px;
        }
        .tree li {
            display: block;
            position: relative;
            padding-left: calc(2 * var(--spacing) - var(--radius) - 2px);
        }
        .tree ul {
            margin-left: calc(var(--radius) - var(--spacing));
            padding-left: 0;
        }
        .tree ul li {
            border-left: 2px solid #ddd;
        }
        .tree ul li:last-child {
            border-color: transparent;
        }
        .tree ul li::before {
            content: '';
            display: block;
            position: absolute;
            top: calc(var(--spacing) / -2);
            left: -2px;
            width: calc(var(--spacing) + 2px);
            height: calc(var(--spacing) + 1px);
            border: solid #ddd;
            border-width: 0 0 2px 2px;
        }
        .tree summary {
            display: block;
            cursor: pointer;
        }


        .tree summary::marker,
        .tree summary::-webkit-details-marker {
            display: none;
        }
        .tree summary:focus {
            outline: none;
        }
        .tree summary:focus-visible {
            outline: 1px dotted #000;
        }
        .tree summary::before {
            content: '';
            display: block;
            position: absolute;
            top: calc(var(--spacing) / 2 - var(--radius));
            left: calc(var(--spacing) - var(--radius) - 1px);
            width: calc(2 * var(--radius));
            height: calc(2 * var(--radius));
            border-radius: 50%;
            background: #ddd;
        }
        .tree li a::after {
            content: '';
            display: block;
            position: absolute;
            top: calc(var(--spacing) / 2 - var(--radius));
            left: calc(var(--spacing) - var(--radius) - 1px);
            width: calc(2 * var(--radius));
            height: calc(2 * var(--radius));
            border-radius: 50%;
            background: #ddd;
        }
        .tree .active a::after {
            content: 'z';
            z-index: 1;
            background: #696;
            color: #fff;
            line-height: calc(2 * var(--radius) - 2px);
            text-align: center;
        }
        .tree .active a{
            color: #0a67fb;
        }
        .tree summary::before {
            content: '+';
            z-index: 1;
            background: #696;
            color: #fff;
            line-height: calc(2 * var(--radius) - 2px);
            text-align: center;
        }
        .tree details[open] > summary::before {
            content: '−';
        }
        .tree ul li a {
            display: block;
            text-decoration: none;
            color: #222222;
        }
        .tree summary:hover{
            color: royalblue;
        }
        .tree a:hover{
            color: royalblue;
        }


        body{
            background: #fff;
        }

        .file-menu{
            background: #eee;
        }

        .source{
            /*background: royalblue;*/
        }
        .main{
            width: 100%;
            display: inline-flex;
        }
        .main .left{
            width: 30%;

        }
        .main .right{
            width: 70%;
        }
        .source{
            padding-left: 10px;
        }

    </style>
</head>
<body>
<div class="main">
    <div class="left">
        <div class="file-menu">
            <ul id="file-list" class="tree">
            </ul>
        </div>
    </div>
    <div class="right">
        <div id="source" class="source"></div>
    </div>
</div>
<script src="/static/js/net.js"></script>
<script>
    net = new Net();
    var data = "<?php echo $data; ?>";
    data = JSON.parse(atob(data));
    var tree = treeFile(data);
    initFileList(tree);
    function showSource(obj) {
        document.querySelectorAll('#file-list .active').forEach(function (active) {
            active.classList.remove('active');
        });
        obj.parentElement.classList.add('active');
        let post_data = {file:obj.dataset.file};
        net.post('showsource.php','data='+JSON.stringify(post_data),function (data) {
            data = JSON.parse(data);
            if(data.code!==200){
                document.getElementById("source").textContent=data.msg;
                return;
            }
            document.getElementById("source").innerHTML='<pre>'+data.data+'</pre>';
        });
    }
    function treeFile(data) {
        for (let i = 0; i < data.length; i++) {
            data[i].childnodes = [];
            data[i].list = [];
            for (let j = 0; j < data.length; j++) {
                if (data[j].pid === data[i].id) {
                    switch (data[j].type) {
                        case 'dir':
                            data[i].childnodes.push(data[j]);
                            break;
                        case 'file':
                            data[i].list.push(data[j]);
                            break;
                    }
                }
            }
        }
        return data[0];
    }

    function initFileList(data) {
        var ul = '';
        ul = getFileList(data, ul);
        document.getElementById("file-list").innerHTML = ul;
        document.querySelectorAll('#file-list a').forEach(function (link) {
            link.addEventListener('click', function (event) {
                event.preventDefault();
                showSource(link);
            });
        });
    }


    function getFileList(obj, ul) {
        ul += '<li>';
        ul += '<details>';
        ul += '<summary>' + obj.name + '</summary>';
        ul += '<ul>';
        if (!(obj.childnodes.length === 0)) {
            for (let key in obj.childnodes) {
                ul = getFileList(obj.childnodes[key], ul);
            }
        }

        if (!(obj.list.length === 0)) {
            for (let key in obj.list) {
                ul += '<li><a href="#" data-file="'+obj.list[key].handle+'">' + obj.list[key].name + '</a></li>';
            }
        }
        ul += '</ul>';
        ul += '</details>';
        ul += '</li>';
        return ul;
    }

</script>
</body>
</html>

net.js

function Net() {
    this.xhr = new XMLHttpRequest();
    this.get = function (url, func, pram = {}) {
        xhr = this.xhr;
        xhr.onreadystatechange = function () {
            if (this.readyState == 4) {
                pram.code = this.status;
                if (this.status == 200) {
                    func(this.responseText, pram);
                } else {
                    func(this.responseText, pram);
                }
            }
        };
        xhr.open('get', url, false);
        xhr.send()
    };
    this.post = function (url, data, func,pram = {}) {
        xhr = this.xhr;
        xhr.onreadystatechange = function () {
            if (this.readyState == 4) {
                pram.code = this.status;
                if (this.status == 200) {
                    func(this.responseText,pram);
                } else {
                    func(this.responseText,pram);
                }
            }
        };
        xhr.open("POST", url, false);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.send(data)
    }
}

showsource.php

<?php
header('Content-Type: text/html; charset=utf-8');

if(empty($_POST['data'])){
    die;
}
$data = $_POST['data'];
$data = json_decode($data,true);
if(empty($data['file'])){
    die;
}

define('root',str_replace('\\','/',realpath(__DIR__.'/../..')));
$dir = root;
$root_dir = $dir;

$pass_files = [
    'root/app/conf.php',
];
$allow_ext = [
    'html','js','css','php','txt','xml','json',
];

$file = $data['file'];

if(in_array($file,$pass_files)){
    outSource(500,'涉及配置不允许高亮','');
    die;
}
if(strpos($file,'.')!==false){
    $file_ext = substr($file,strripos($file,'.')+1,strlen($file));
    if(!in_array($file_ext,$allow_ext)){
        outSource(500,'只允许高亮'.implode('|',$allow_ext).'后缀文件','');
        die;
    }
}

$file = preg_replace('/^root/',$root_dir,$file);
if(!is_file($file)){
    outSource(500,'文件不存在','');
    die;
}

$code = highlight_file($file,true);
outSource(200,'',$code);

function outSource($code,$msg,$data)
{
    echo json_encode([
        'code'=>$code,
        'msg'=>$msg,
        'data'=>$data,
    ],JSON_UNESCAPED_UNICODE);
}

注:配置好不允许高亮的文件名,安全第一

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1626398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短视频素材去哪里找,而且不带水印的那种?

为了确保视频创作者能够接触到全球范围内的优质资源&#xff0c;下面列出的视频素材网站各具特色&#xff0c;提供从标准视频到高动态范围&#xff08;HDR&#xff09;的素材&#xff0c;满足你在不同项目中的需求。 1. 蛙学府 (中国) 提供专业级的视频素材&#xff0c;特别适…

制糖工业智能工厂数字孪生可视化平台,推进制糖产业数字化转型

制糖工业智能工厂数字孪生可视化平台&#xff0c;推进制糖产业数字化转型。随着信息技术的快速发展&#xff0c;数字化转型已成为各行各业的重要趋势。在糖果加工制造领域&#xff0c;智能工厂数字孪生可视化平台的出现&#xff0c;为行业数字化转型注入了新的活力。 糖果加工制…

【002_音频开发_基础篇_Linux音频架构简介】

002_音频开发_基础篇_Linux音频架构简介 文章目录 002_音频开发_基础篇_Linux音频架构简介创作背景Linux 音频架构ALSA 简介ASoC 驱动硬件架构软件架构MachinePlatformCodec ASoC 驱动 PCMALSA设备文件结构 ALSA 使用常用概念alsa-libALSA Open 流程ALSA Write 流程2种写入方法…

抖音获客新技能,品牌光彩夺目秘籍!

在数字化的浪潮中&#xff0c;社交媒体营销已成为品牌推广的重要手段。尤其是短视频平台&#xff0c;以其快速、直观的特点捕获了亿万用户的注意力。在这样的背景下&#xff0c;抖音作为一个重量级的短视频平台&#xff0c;吸引了大量的企业和品牌入驻&#xff0c;希望通过短视…

Rancher 应用商店离线环境使用

前言 Rancher (v2.5 ) 应用商店可以方便的安装 Helm3 构建的应用&#xff0c;并且支持私有 helm 应用仓库&#xff0c;方便了内网离线环境下的使用。本文以内网离线环境为前提、以 MySQL 5.7.43 版本为应用举例&#xff0c;从零开始手把手教你如何制作并应用。 1、环境准备 1.…

H5点击复制功能 兼容安卓、IOS

效果图 HTML代码 <div>链接&#xff1a;<span style"color: #FF8A21" click"CopyUrl" id"copyId"> https://blog.csdn.net/qq_51463650?spm1000.2115.3001.5343</span> </div>复制方法 const CopyUrl () > {let …

Git工具的使用

文章目录 Git概述本地仓库命令远程仓库命令分支操作标签操作 IDEA上执行Git Git概述 一般工作流程如下&#xff1a; 从远程仓库中克隆 Git 资源作为本地仓库&#xff1b; 从本地仓库中checkout代码然后进行代码修改&#xff1b; 在提交本地仓库前先将代码提交到暂存区&#xff…

利用Spring Boot后端与Vue前端技术构建现代化电商平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

python基础——正则表达式

&#x1f4dd;前言&#xff1a; 这篇文章主要想讲解一下python中的正则表达式&#xff1a; 1&#xff0c;什么是正则表达式 2&#xff0c;re模块三匹配 3&#xff0c;元字符匹配 4&#xff0c;具体示例 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&am…

【C++】STL-vector的使用

目录 1、什么是vector&#xff1f; 2、vector的使用 2.1 vector的定义 ​编辑 2.2 遍历修改数据 2.3 迭代器 2.4 vector空间增长问题 2.5 vector的增删查改 3、迭代器失效 3.1 会引起其底层空间改变的操作&#xff0c;都有可能是迭代器失效 3.2 指定位置元素的删除操…

【Linux】如何进行用户之间的切换——指令su

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

消费新纪元:揭秘消费增值模式,让你的每一分钱都“钱生钱”

你是否对传统消费方式有所不满&#xff0c;认为它只停留在物质层面的交换&#xff0c;缺乏更深层次的附加价值&#xff1f;那么&#xff0c;我要为你揭晓一种新颖的消费模式——消费增值&#xff0c;它将为你的消费观念带来全新的变革&#xff0c;让你的每一笔消费都充满无限可…

CLIP图生文

CLIP模型本身并不是图生文的&#xff0c;CLIP模型用来做图片和文本描述的匹配。 但它可以与其他技术结合使用来实现这一点&#xff0c;以下是两种常见的方法&#xff1a; CLIP作为文本灵感检索系统&#xff1a; 这种方法利用了 CLIP 在寻找图像和文本之间相似表示方面的优势。…

关于豆瓣电影数据抓取以及可视化

首先我们可以先了解以下网络爬虫的定义&#xff1a; 爬虫是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。它可以在互联网上自动抓取网页内容&#xff0c;将这些信息存储起来。爬虫可以抓取网站的所有网页&#xff0c;从而获取对于我们有价值的信…

跨界客户服务:拓展服务边界,创造更多价值

在日益激烈的市场竞争中&#xff0c;企业如何突破传统服务模式的限制&#xff0c;创造更多价值&#xff0c;已成为业界关注的焦点。跨界客户服务作为一种新兴服务模式&#xff0c;正逐渐受到企业的青睐。通过跨界合作&#xff0c;企业可以拓展服务边界&#xff0c;提供更加多元…

数据治理和数据管理 傻傻分不清楚?

互联网时代&#xff0c;数据&#xff0c;这一无形资产&#xff0c;已成为现代企业的核心竞争力。如何高效地管理和利用数据&#xff0c;成为企业关注的焦点。在这个过程中&#xff0c;数据治理&#xff08;Data Governance&#xff09;和数据管理&#xff08;Data Management&a…

[SpringBoot] JWT令牌——登录校验

JWT&#xff08;JSON Web Token&#xff09;是一种用于在网络应用之间传递信息的开放标准&#xff08;RFC 7519&#xff09;。它由三部分组成&#xff1a;头部&#xff08;header&#xff09;、载荷&#xff08;payload&#xff09;和签名&#xff08;signature&#xff09;。J…

android 去除桌面谷歌搜索框

注&#xff1a; 本文只是博主学习记录分享&#xff0c;仅供参考。如有错误请指出来&#xff0c;谢谢&#xff01; 一、问题描述 去除 android 系统桌面谷歌搜索栏&#xff0c;前后对比如下图&#xff1a; 系统版本&#xff1a;android12 平台&#xff1a;rk3568 二、…

DNS域名系统 | unbound

目录 DNS 命名空间和域名结构 DNS的命名空间的结构: 域名服务器的分类&#xff1a; ​编辑 DNS 资源记录 常见type: DNS报文结构 请求报文&#xff1a; 响应报文&#xff1a; 解析类型 递归查询 迭代查询 DNS劫持 DNS劫持方法&#xff1a; 防御措施 DNS服务部署…

【Java EE】 文件IO的使用以及流操作

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…