基本上,给定一个基本 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/