php - 相对 + 基本 URL 到绝对 URL?

标签 php

基本上,给定一个基本 URL,例如

file:///path/to/some/file.html

还有一个相对 URL,比如

another_file.php?id=5

我想出去

file:///path/to/some/another_file.php?id=5

我找到了 this script (与 this one 相同)但它似乎不适用于 file://方案。在使用我的代码之前,我正在做一些本地测试,所以我想同时处理 file://http:// .

有人知道可以执行此操作的脚本/函数吗?

在 C# 中,我会使用 Uri(Uri base, string rel) .


以上只是一个例子。它应该适用于您可以放入 <a href="xxx">任何 URL .


这是迄今为止我得到的最好的,但它无法处理 ..可能还有其他一些事情:

function rel2abs($base, $rel) {
    if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
    if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel;
    $parse = parse_url($base);
    $path = preg_replace('#/[^/]*$#', '', $parse['path']);
    if ($rel[0] == '/') $path = '';
    $abs = (isset($path['host'])?$path['host']:'')."$path/$rel";
    $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
    for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}
    return $parse['scheme'].'://'.$abs;
}

最佳答案

您可以使用 parse_url()将 URL 分成几部分,然后在正斜杠字符上拆分“路径”部分。这应该允许您重新组装它们并替换最后一部分。

类似这样的东西(伪代码,未经测试,甚至不确定它是否是有效的 PHP 语法):

$url_parts = parse_url($url_text);
$path_parts = explode('/', $url_parts[path]);

$new_url = $url_parts[scheme] + ":";

if ($url_parts[scheme] == "file") {
    $new_url .= '///';
} else {
    $new_url .= '//';
}

$new_url .= $url_parts[hostname] . '/';
for (int i = 0; i < count($path_parts) - 1; i++) {
    $new_url .= $path_parts[i] . "/";
} 

$new_url .= $REPLACEMENT_FILENAME

如果需要,您可以在末尾附加查询字符串和/或 anchor 片段(以 # 开头)- 请参阅 parse_url() 手册页以获取其数组中 URL 部分的列表。

关于php - 相对 + 基本 URL 到绝对 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11215440/

相关文章:

php - CakePHP 多个应用程序的共享核心

php - 如果等于在 PHP 和 MySQL 中输入的值,则显示内容

php - 如何通过将一个表中的 ID 与另一个表匹配来选择和更新一个表中的记录?

php - 城市名称到地理坐标的PHP脚本?

javascript - 使用 PHP 制作 Javascript 数组

php - javascript中参数的位掩码类型

php - Doctrine2 : dynamic entity associations, 多个目标实体被一个字段映射

php - 显示每个用户的点击次数

php - 我应该如何命名我的 PHP 类文件?

javascript - 如何将表中的项目放入数组jquery