在适当嵌套的列表中包装输出 - PHP目录列表

时间:2017-08-02 22:27:07

标签: php html

好的,我一直在寻找一种列出目录和文件的方法,我已经想出并使用我在StackOverflow(Listing all the folders subfolders and files in a directory using php)上找到的代码。

到目前为止,我已经修改了其中一个答案中找到的代码。我已经能够使用preg_replace从路径和文件名中删除文件扩展名,使用ucwords将文件名大写,并使用str_replace为空格切换短划线。

我现在遇到的麻烦是将整个内容包装在一个正确嵌套的HTML列表中。我设法将其设置为列表,但它并没有在需要的地方使用嵌套列表,而且我不能在我的生活中弄清楚如何大写目录名称或替换目录名称中的任何短划线。

所以,问题是,如果有人会如此善良:

  1. 如何将输出包装在正确嵌套的列表中?
  2. 如何在删除前面的斜杠时将目录名称大写并用空格替换短划线或下划线?
  3. 我故意将|&nbsp;&nbsp;变为$ss变量。当我想要输入能够识别它在试验和错误期间出现的位置的字符时,我将它用作各种标记(例如$ss = $ss . "<li>workingOrNot")。

    我正在使用:

    <?php
    $pathLen = 0;
    
    function prePad($level) {
        $ss = "";
    
        for ($ii = 0;   $ii < $level;   $ii++) {
            $ss = $ss . "|&nbsp;&nbsp;";
        }
    
        return $ss;
    }
    
    function dirScanner($dir, $level, $rootLen) {
        global $pathLen;
    
        $filesHidden = array(".", "..", '.htaccess', 'resources', 'browserconfig.xml', 'scripts', 'articles');
    
        if ($handle = opendir($dir)) {
    
            $fileList = array();
    
            while (false !== ($entry = readdir($handle))) {
                if ($entry != "." && $entry != ".." && !in_array($entry, $filesHidden)) {
                    if (is_dir($dir . "/" . $entry)) {
                        $fileList[] = "F: " . $dir . "/" . $entry;
                    }
                    else {
                        $fileList[] = "D: " . $dir . "/" . $entry;
                    }
                }
            }
            closedir($handle);
    
            natsort($fileList);
    
            foreach($fileList as $value) {
                $displayName = ucwords ( str_replace("-", " ", substr(preg_replace('/\\.[^.\\s]{3,5}$/', '', $value), $rootLen + 4)));
    
                $filePath = substr($value, 3);
    
                $linkPath = str_replace(" ", "%20", substr(preg_replace('/\\.[^.\\s]{3,5}$/', '', $value), $pathLen + 3));
    
                if (is_dir($filePath)) {
                    echo prePad($level) . "<li>" . $linkPath . "</li>\n";
    
                    dirScanner($filePath, $level + 1, strlen($filePath));
    
                } else {
                    echo "<li>" . prePad($level) . "<a href=\"" . $linkPath . "\" class=\"className\">" . $displayName . "</a></li>\n";
                }
            }
        }
    } 
    

    我觉得这些答案应该很简单,所以也许我过去两天一直盯着它看,或者它已成为弗兰肯斯坦代码。

    我出于反复试验而需要帮助。

1 个答案:

答案 0 :(得分:1)

foreach($fileList as $value) {
    $displayName = ucwords ( str_replace("-", " ", substr(preg_replace('/\\.[^.\\s]{3,5}$/', '', $value), $rootLen + 4)));

    $filePath = substr($value, 3);

    $linkPath = str_replace(" ", "%20", substr(preg_replace('/\\.[^.\\s]{3,5}$/', '', $value), $pathLen + 3));

    if (is_dir($filePath)) {
        // Do not close <li> yet, instead, open an <ul>
        echo prePad($level) . "<li>" . $linkPath; . "<ul>\n";
        dirScanner($filePath, $level + 1, strlen($filePath));
        // Close <li> and <ul>
        echo "</li></ul>\n";
    } else {
        echo "<li>" . prePad($level) . "<a href=\"" . $linkPath . "\" class=\"className\">" . $displayName . "</a></li>\n";
    }
}

我猜你在调用函数之前打开main函数并在结束时关闭它。