gpt4 book ai didi

php - 将相对 URL 转换为绝对

转载 作者:可可西里 更新时间:2023-10-31 23:40:13 35 4
gpt4 key购买 nike

假设我有一个文档链接到另一个文档的 URL(可以是绝对的也可以是相对的),我需要这个链接是绝对的。

我制作了一个简单的函数,为几种常见情况提供此功能:

function absolute_url($url,$parent_url){
$parent_url=parse_url($parent_url);
if(strcmp(substr($url,0,7),'http://')==0){
return $url;
}
elseif(strcmp(substr($url,0,1),'/')==0){
return $parent_url['scheme']."://".$parent_url['host'].$url;
}
else{
$path=$parent_url['path'];
$path=substr($path,0,strrpos($path,'/'));
return $parent_url['scheme']."://".$parent_url['host']."$path/".$url;
}
}

$parent_url='http://example.com/path/to/file/name.php?abc=abc';
echo absolute_url('name2.php',$parent_url)."\n";
// output http://example.com/path/to/file/name2.php
echo absolute_url('/name2.php',$parent_url)."\n";
// output http://example.com/name2.php
echo absolute_url('http://name2.php',$parent_url)."\n";
// output http://name2.php

代码工作正常,但可能会有更多情况,例如 ../../path/to/file.php 将无法工作。

那么是否有任何标准类或函数比我的函数做得更好(更通用)?

我试着用谷歌搜索它并检查了类似的问题(onetwo),但它看起来像服务器路径相关的解决方案,这不是我要找的东西。

最佳答案

此函数会将相对 URL 解析为 $pgurl 给定当前页面 url,无需正则表达式。它成功解决了:

/home.php?example 类型,

相同目录 nextpage.php 类型,

../...../.../parentdir 类型,

完整的 http://example.net 网址,

和简写//example.net urls

//Current base URL (you can dynamically retrieve from $_SERVER)
$pgurl = 'http://example.com/scripts/php/absurl.php';

function absurl($url) {
global $pgurl;
if(strpos($url,'://')) return $url; //already absolute
if(substr($url,0,2)=='//') return 'http:'.$url; //shorthand scheme
if($url[0]=='/') return parse_url($pgurl,PHP_URL_SCHEME).'://'.parse_url($pgurl,PHP_URL_HOST).$url; //just add domain
if(strpos($pgurl,'/',9)===false) $pgurl .= '/'; //add slash to domain if needed
return substr($pgurl,0,strrpos($pgurl,'/')+1).$url; //for relative links, gets current directory and appends new filename
}

function nodots($path) { //Resolve dot dot slashes, no regex!
$arr1 = explode('/',$path);
$arr2 = array();
foreach($arr1 as $seg) {
switch($seg) {
case '.':
break;
case '..':
array_pop($arr2);
break;
case '...':
array_pop($arr2); array_pop($arr2);
break;
case '....':
array_pop($arr2); array_pop($arr2); array_pop($arr2);
break;
case '.....':
array_pop($arr2); array_pop($arr2); array_pop($arr2); array_pop($arr2);
break;
default:
$arr2[] = $seg;
}
}
return implode('/',$arr2);
}

使用示例:

echo nodots(absurl('../index.html'));

nodots() 必须在 URL 转换为绝对 URL 之后 调用。

dots 函数有点多余,但可读性强、速度快、不使用正则表达式,并且可以解析 99% 的典型 url(如果您想 100% 确定,只需扩展开关 block 以支持 6+点,尽管我从未在 URL 中看到过那么多点)。

希望对您有所帮助,

关于php - 将相对 URL 转换为绝对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26423904/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com