代码之家  ›  专栏  ›  技术社区  ›  Graham Perks

php:构建URL路径

php
  •  5
  • Graham Perks  · 技术社区  · 15 年前

    我有几个字符串可以组合以构建完整的路径。例如

    $base = "http://foo.com";
    $subfolder = "product/data";
    $filename = "foo.xml";
    
    // How to do this?
    $url = append_url_parts($base, $subfolder, $filename); ???
    

    字符串连接不起作用,这将省略必要的正斜杠。

    在Win32中,我使用PathCombine()或PathAppend(),它可以处理在字符串之间添加任何必要的斜杠,而不会将它们加倍。在PHP中,我应该使用什么?

    7 回复  |  直到 11 年前
        1
  •  3
  •   Jacob Relkin    15 年前

    试试这个:

    $base = "http://foo.com";
    $subfolder = "product/data";
    $filename = "foo.xml";
    
    function stripTrailingSlash(&$component) {
        $component = rtrim($component, '/');
    }
    $array = array($base, $subfolder, $filename);
    array_walk_recursive($array, 'stripTrailingSlash'); 
    $url = implode('/', $array);
    
        2
  •  3
  •   RobertPitt    15 年前

    当涉及到这样的问题时,我喜欢使用一个具有无限参数的特殊函数。

    define('BASE_URL','http://mysite.com'); //Without last slash
    function build_url()
    {
        return BASE_URL . '/' . implode(func_get_args(),'/');
    }
    

    function build_url()
    {
        $Path = BASE_URL;
        foreach(func_get_args() as $path_part)
        {
            $Path .= '/' . $path_part;
        }
        return $Path;
    }
    

    所以当我使用这个函数的时候

    echo build_url('home'); //http://mysite.com/home
    echo build_url('public','css','style.css'); //http://mysite.com/public/css/style.css
    echo build_url('index.php'); //http://mysite.com/index.php
    

    希望这对您有帮助,特别是在框架环境中,它对我非常有用。

    要与参数一起使用,您可以像这样附加URL,以便简化。

    echo build_url('home') . '?' .  http_build_query(array('hello' => 'world'));
    

    会产生: http://mysite.com/home?hello=world

        3
  •  0
  •   antoniuslin    15 年前

    不知道为什么你说字符串concat不起作用,因为类似这样的东西基本上类似于字符串concat。(未测试的半伪)

    function append_url_parts($base, $subf, $file) {
        $url = sprintf("%s%s%s", $base, (($subf)? "/$subf": ""), (($file)? "/$file": ""));
        return $url;
    }
    

    对于字符串concat,我们必须编写一个稍长的块,如下所示:

    function append_url_parts($base, $subf, $file) {
        $subf = ($subf)? "/$subf": "";
        $file = ($file)? "/$file": "";
        $url = "$base$subf$file";
        return $url;
    }
    
        4
  •  0
  •   davidtbernal    15 年前

    我通常很简单:

    <?
        $url = implode('/', array($base, $subfolder, $filename));
    

    或者使用一个框架,然后使用它拥有的任何路由系统。

        5
  •  0
  •   Geekster    15 年前

    首先要考虑几个问题。

    1. 您对获取脚本的当前路径或其他路径感兴趣吗?
    2. 你需要多灵活?是什么东西会一直改变吗?是管理员设置一次就会忘记的东西吗?
    3. 你要小心不要包含斜线错误,因为你太懒了,不知道如何将目录变量和文件变量分开。每个URL只有一个文件和一个基,并且每个路径中的目录数目未知,对吗?:)
        6
  •  0
  •   KoZm0kNoT    12 年前

    如果你想确保合成路径中没有重复的斜杠,我喜欢这个小函数……简单地给它传递一个你想要组合的路径部分数组,它将返回一个格式化的路径-不需要担心任何部分是否包含斜杠alerady:

    function build_url($arr) 
    {
        foreach ( $arr as $path ) $url[] = rtrim ( $path, '/' );
        return implode( $url, '/' );
    }
    

    这也适用于所有版本的PHP。

        7
  •  0
  •   Elia Weiss    11 年前

    不是我的代码,而是一个方便的函数,它采用一个绝对URL和一个相对URL,并将两者结合起来形成一个新的绝对路径。

    该函数已被修改为忽略作为相对传递的绝对URL(基本上包括模式的任何内容)。

    $url = "http://www.goat.com/money/dave.html";
    $rel = "../images/cheese.jpg";
    
    $com = InternetCombineURL($url,$rel);
    public function InternetCombineUrl($absolute, $relative) {
            $p = parse_url($relative);
            if(isset($p["scheme"]))return $relative;
    
            extract(parse_url($absolute));
    
            $path = dirname($path); 
    
            if($relative{0} == '/') {
                $cparts = array_filter(explode("/", $relative));
            }
            else {
                $aparts = array_filter(explode("/", $path));
                $rparts = array_filter(explode("/", $relative));
                $cparts = array_merge($aparts, $rparts);
                foreach($cparts as $i => $part) {
                    if($part == '.') {
                        $cparts[$i] = null;
                    }
                    if($part == '..') {
                        $cparts[$i - 1] = null;
                        $cparts[$i] = null;
                    }
                }
                $cparts = array_filter($cparts);
            }
            $path = implode("/", $cparts);
            $url = "";
            if($scheme) {
                $url = "$scheme://";
            }
            if(isset($user)) {
                $url .= "$user";
                if($pass) {
                    $url .= ":$pass";
                }
                $url .= "@";
            }
            if($host) {
                $url .= "$host/";
            }
            $url .= $path;
            return $url;
        }
    
    推荐文章