PHP利用正则表达式将相对路径转成绝对路径的方法示例

发布时间 - 2026-01-10 23:19:47    点击率:

前言

大家应该都有所体会,很多时候在做网络爬虫的时候特别需要将爬虫搜索到的超链接进行处理,统一都改成绝对路径的,所以本文就写了一个正则表达式来对搜索到的链接进行处理。下面话不多说,来看看详细的介绍吧。

通常我们可能会搜索到如下的链接:

<!-- 空超链接 -->
<a href=""></a> 
<!-- 空白符 -->
<a href=" " rel="external nofollow" > </a>
<!-- a标签含有其它属性 -->
<a href="index.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" alt="超链接"> index.html </a>
<a href="/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" target="_blank"> / target="_blank" </a>
<a target="_blank" href="/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" alt="超链接" > target="_blank" / alt="超链接" </a>
<a target="_blank" title="超链接" href="/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" alt="超链接" > target="_blank" title="超链接" / alt="超链接" </a>
<!-- 根目录 -->
<a href="/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" > / </a>
<a href="a" rel="external nofollow" > a </a>
<!-- 含参数 -->
<a href="/index.html?id=1" rel="external nofollow" > /index.html?id=1 </a>
<a href="?id=2" rel="external nofollow" > ?id=2 </a>
<!-- // -->
<a href="//index.html" rel="external nofollow" > //index.html </a>
<a href="//www.mafutian.net" rel="external nofollow" > //www.mafutian.net </a>
<!-- 站内链接 -->
<a href="http://www.hole_1.com/index.html" rel="external nofollow" > http://www.hole_1.com/index.html </a>
<!-- 站外链接 -->
<a href="http://www.mafutian.net" rel="external nofollow" > http://www.mafutian.net </a>
<a href="http://www.numberer.net" rel="external nofollow" > http://www.numberer.net </a>
<!-- 图片,文本文件格式的链接 -->
<a href="1.jpg" rel="external nofollow" > 1.jpg </a>
<a href="1.jpeg" rel="external nofollow" > 1.jpeg </a>
<a href="1.gif" rel="external nofollow" > 1.gif </a>
<a href="1.png" rel="external nofollow" > 1.png </a>
<a href="1.txt" rel="external nofollow" > 1.txt </a>
<!-- 普通链接 -->
<a href="index.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" > index.html </a>
<a href="index.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" > index.html </a>
<a href="./index.html" rel="external nofollow" > ./index.html </a>
<a href="../index.html" rel="external nofollow" > ../index.html </a>
<a href=".../" rel="external nofollow" > .../ </a>
<a href="..." rel="external nofollow" > ... </a>
<!-- 非链接,含有链接冒号 --> 
<a href="javascript:void(0)" rel="external nofollow" > javascript:void(0) </a>
<a href="a:b" rel="external nofollow" > a:b </a>
<a href="/a#a:b" rel="external nofollow" > /a#a:b </a>
<a href="mailto:'mafutian@126.com'" rel="external nofollow" > mailto:'mafutian@126.com' </a>
<a href="/tencent://message/?uin=335134463" rel="external nofollow" > /tencent://message/?uin=335134463 </a> 
<!-- 相对路径 -->
<a href="." rel="external nofollow" > . </a>
<a href=".." rel="external nofollow" > .. </a>
<a href="../" rel="external nofollow" > ../ </a>
<a href="/a/b/.." rel="external nofollow" > /a/b/.. </a>
<a href="/a" rel="external nofollow" > /a </a>
<a href="./b" rel="external nofollow" > ./b </a>
<a href="./././././././././b" rel="external nofollow" > ./././././././././b </a> <!-- 其实就是 ./b -->
<a href="../c" rel="external nofollow" > ../c </a>
<a href="../../d" rel="external nofollow" > ../../d </a>
<a href="../a/../b/c/../d" rel="external nofollow" > ../a/../b/c/../d </a>
<a href="./../e" rel="external nofollow" > ./../e </a>
<a href="http://www.hole_1.org/./../e" rel="external nofollow" > http://www.hole_1.org/./../e </a> 
<a href="./.././f" rel="external nofollow" > ./.././f </a>
<a href="http://www.hole_1.org/../a/.../../b/c/../d/.." rel="external nofollow" > http://www.hole_1.org/../a/.../../b/c/../d/.. </a> 
<!-- 带有端口号 -->
<a href=":8081/index.html" rel="external nofollow" > :8081/index.html </a>
<a href="http://www.mafutian.net:80/index.html" rel="external nofollow" > :80/index.html </a>
<a href="http://www.mafutian.net:8081/index.html" rel="external nofollow" > http://www.mafutian.net:8081/index.html </a>
<a href="http://www.mafutian.net:8082/index.html" rel="external nofollow" > http://www.mafutian.net:8082/index.html </a>

处理的第一步,设置成绝对路径:

http:// ... / ../ ../

然后本文讲讲如何去除绝对路径中的 './'、'../'、'/..'的实现代码:

function url_to_absolute($relative)
{
 $absolute = '';
 // 去除所有的 './'
 $absolute = preg_replace('/(?<!\.)\.\//','',$relative);
 $count = preg_match_all('/(?<!\/)\/([^\/]{1,}?)\/\.\.\//',$absolute,$res);
 // 迭代去除所有的 '/abc/../'
 do
 {
 $absolute = preg_replace('/(?<!\/)\/([^\/]{1,}?)\/\.\.\//','/',$absolute);
 $count = preg_match_all('/(?<!\/)\/([^\/]{1,}?)\/\.\.\//',$absolute,$res); 
 }while($count >= 1);
 // 除去最后的 '/..'
 $absolute = preg_replace('/(?<!\/)\/([^\/]{1,}?)\/\.\.$/','/',$absolute);
 $absolute = preg_replace('/\/\.\.$/','',$absolute);
 // 除去存在的 '../'
 $absolute = preg_replace('/(?<!\.)\.\.\//','',$absolute);
 return $absolute;
}
$relative = 'http://www.mytest.org/../a/.../../b/c/../d/..';
var_dump(url_to_absolute($relative));
// 输出:string 'http://www.mytest.org/a/b/' (length=26)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# php相对路径  # 绝对路径  # 正则表达式  # 相对路径  # 相对路径转绝对路径  # 谈谈PHP中相对路径的问题与绝对路径的使用  # PHP文件操作之获取目录下文件与计算相对路径的方法  # php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法  # php计算两个文件相对路径的方法  # PHP获取文件相对路径的方法  # php求两个目录的相对路径示例(php获取相对路径)  # 一道求$b相对于$a的相对路径的php代码  # php绝对路径与相对路径之间关系的的分析  # php zend 相对路径问题  # php 算法之实现相对路径的实例  # 超链接  # 站内  # 来看看  # 写了  # 这篇文章  # 谢谢大家  # 多说  # 设置成  # 端口号  # 迭代  # 有疑问  # alt  # target  # _blank  # html  # external  # nofollow  # index  # mafutian 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  JavaScript如何实现继承_有哪些常用方法  如何用虚拟主机快速搭建网站?详细步骤解析  北京专业网站制作设计师招聘,北京白云观官方网站?  如何在云主机上快速搭建网站?  Laravel Docker环境搭建教程_Laravel Sail使用指南  Laravel如何为API生成Swagger或OpenAPI文档  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel中的Facade(门面)到底是什么原理  如何在IIS管理器中快速创建并配置网站?  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel如何处理异常和错误?(Handler示例)  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  网页设计与网站制作内容,怎样注册网站?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何在IIS7上新建站点并设置安全权限?  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何快速选择适合个人网站的云服务器配置?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何用腾讯建站主机快速创建免费网站?  网站制作免费,什么网站能看正片电影?  Python进程池调度策略_任务分发说明【指导】  jquery插件bootstrapValidator表单验证详解  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  ,怎么在广州志愿者网站注册?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  简单实现Android验证码  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Laravel如何创建自定义Artisan命令?(代码示例)  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  如何快速辨别茅台真假?关键步骤解析  大连网站制作公司哪家好一点,大连买房网站哪个好?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)