【问题标题】:How to split a path properly in PHP如何在 PHP 中正确分割路径
【发布时间】:2011-09-11 12:29:12
【问题描述】:

执行以下操作的最佳方法是什么:

我得到一个带有 AJAX 请求的路径

例如dir1/dir2/dir3/dir4

我需要在我的网页上这样展示它:

dir1 >> dir2 >> dir3 >> dir4

每个都是html锚标签,href属性是

/dir1

/dir1/dir2

/dir1/dir2/dir3

/dir1/dir2/dir3/dir4 

分别

实现这一目标的最优雅和最有效的方法是什么?

到目前为止,我正在做这样的事情,我认为这真的很脏:

<?php 
$dirs = explode(PATH_SEPARATOR, $this->metadata["path"]);
    foreach ($dirs as $key=>$val) {
             if ($val == '') {
                 continue;
             }
             $pathArray = array();
             for ($i = 0; $i <= $key; $i++) {
                 array_push($pathArray, $dirs[$i]);
             }
             $path = implode('/', $pathArray);
             echo " >> <a href=" . $path . ">" . truncate($val) . "</a>";
    }
    ?>  

【问题讨论】:

  • 虽然truncate 函数不存在,但对我来说似乎是正确的(而且不是那么脏)。它是自定义函数还是您的意思是trim
  • 它是一个自定义函数......所以..你认为它是一个优雅的代码块?:)
  • 好吧,我就是这样做的。如果这很优雅,那么万岁:D

标签: php path split


【解决方案1】:

可能是这样的(如果我的意图正确的话):

<?php
$str = 'dir1/dir2/dir3/dir4';

$output = array();
$chunks = explode('/', $str);
foreach ($chunks as $i => $chunk) {
    $output[] = sprintf(
        '<a href="#/%s">%s</a>',
        implode('/', array_slice($chunks, 0, $i + 1)),
        $chunk
    );
}

echo implode(' &gt;&gt; ', $output);

输出:

<a href="#/dir1">dir1</a> &gt;&gt; 
<a href="#/dir1/dir2">dir2</a> &gt;&gt;
<a href="#/dir1/dir2/dir3">dir3</a> &gt;&gt;
<a href="#/dir1/dir2/dir3/dir4">dir4</a>

【讨论】:

  • 我最喜欢你的解决方案,我会支持你的。非常感谢您的时间和回答。
  • 对于带有不同斜线的不同文件系统呢?
  • @Sevenearths 我看不到与操作系统特定文件系统的关系。但如果需要,只需在代码中使用 "/" 以外的其他字符。
  • windows \\ 和 unix /(或类似的东西)
【解决方案2】:

变量 1

<?php

    $str = '/dir1/dir2/dir3/dir4';
    $arr = array_filter(explode('/',$str));
    $out = array('/'.implode('/',$arr).'/');
    while((array_pop($arr) and !empty($arr))){
        $out[] = '/'.implode('/',$arr).'/';
    };

    print_r($out);

    /*
    Array(
       [0] => /dir1/dir2/dir3/dir4/
       [1] => /dir1/dir2/dir3/
       [2] => /dir1/dir2/
       [3] => /dir1/
    )
    */

?>

变量 2(链接)

<?php

    $str = '/dir1/dir2/dir3/dir4';
    $arr = array_filter(explode('/',$str));
    $out = array('<a href="/'.implode('/',$arr).'/">'.basename($str).'</a>');
    while((array_pop($arr) and !empty($arr))){
        $out[] = '<a href="/'.implode('/',$arr).'/">'.end($arr).'</a>';
    };

    print_r($out);

    /*
    Array
    (
        [0] => <a href="/dir1/dir2/dir3/dir4/">dir4</a>
        [1] => <a href="/dir1/dir2/dir3/">dir3</a>
        [2] => <a href="/dir1/dir2/">dir2</a>
        [3] => <a href="/dir1/">dir1</a>
    )
    */

?>

【讨论】:

    【解决方案3】:

    我会这样做......

    <?php
    
    $path = 'dir1/dir2/dir3/dir4';
    $dirs = explode('/', $path);
    
    while (count($dirs) > 0) {
        $link = '/' . implode($dirs, '/');
        $text = array_pop($dirs);
        $breadcrumb = "<a href=\"$link\">$text</a>" . $breadcrumb;
        if (count($dirs) > 0) {
            $breadcrumb = ' &gt;&gt; ' . $breadcrumb;
        }
    }
    
    echo $breadcrumb;
    

    如果您根据 URL 获取此路径,则不需要使用 DIRECTORY_SEPARATOR,因为 URL 应始终使用 /。如果它是从文件系统路径派生的,则需要将其换入,而不是第 4 行的 '/'

    【讨论】:

    • 感谢 PATH_SEPARATOR .. 我现在正在做 explode('/', $path) :)
    • @user787124:注意PATH_SEPARATOR不是/或\——它是;或 : 分别在 Windows 和 Unix 上。这是您可能想要使用的DIRECTORY_SEPARATOR
    【解决方案4】:

    如果您需要做的只是通过正斜杠爆炸,那么有一个简单的解决方案,每次都有效。

    看看这个

    $path = 'dir1/dir2/dir3/dir4';
    
    $array = explode('/', ltrim($path, '/'));
    
    print_r($array);
    

    享受:D

    【讨论】:

      【解决方案5】:

      也许这样更容易

      preg_split("#/#", ltrim("example/example2/example3/etc/", "/"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 1970-01-01
        • 2017-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多