PHP怎样用正则抓取页面中的网址


Posted in PHP onAugust 09, 2016

前言

链接也就是超级链接,是从一个元素(文字、图片、视频等)链接到另一个元素(文字、图片、视频等)。网页中的链接一般有三种,一种是绝对URL超链接,也就是一个页面的完整路径;另一种是相对URL超链接,一般都链接到同一网站的其他页面;还有一种是页面内的超链接,这种一般链接到同一页面内的其他位置。

搞清楚了链接的种类,就知道要抓链接,主要还是绝对URL超链接和相对URL超链接。要写出正确的正则表达式,就必须要了解我们查找的对象的模式。

先说绝对链接,也叫作URL(Uniform Resource Locator),标识了互联网上的唯一资源。URL的结构包含三部分:协议、服务器名称、路径和文件名

协议是告诉浏览器如何处理将要打开文件的标识,最常见的就是 http 协议。本文也只考虑HTTP协议,至于其他的 https、ftp、mailto、telnet协议等,根据需要也可以添加。

服务器名称是告诉浏览器如何到达这个服务器的方式,通常是域名或者IP地址,有时还会包含端口号(默认为80)。FTP协议中,也可以包含用户名和密码,本文就不考虑了。

路径和文件名,一般以 / 分割,指出到达这个文件的路径和文件本身的名称。如果没有具体的文件名,则访问这个文件夹下的默认文件(可以在服务器端设置)。

那么现在清楚了,要抓取的绝对链接的典型形式可以概括为

http://www.xxx.com/xxx/yyy/zzz.html

每个部分可以使用的字符范围有明确的规范,具体可以参考RFC1738。那么正则表达式就可以写出来了。

/(http|https):\/\/([\w\d\-_]+[\.\w\d\-_]+)[:\d+]?([\/]?[\w\/\.]+)/i

解释如下:

(http|https)第一个括号内匹配的是协议部分。

([\w\d\-_]+[\.\w\d\-_]+)第二个括号内匹配的是域名部分。

([\/]?[\w\/\.]+)第三个括号内匹配的是相对路径。

写到这个时候,基本上大部分的网址都能匹配到了,但是对于URL中带有参数的还不能抓取,这样有可能造成再次访问的时候页面报错。关于参数RFC1738规范中要求是用?来分割,后面带上参数,但是现代的RIA应用有可能使用其他奇怪的形式进行分割。

稍微修改一下,这样就可以将查询参数部分搜索出来。这里仍然没有涵盖全部的情况,例如URL中有中文、有空格及其他特殊字符的情况,但是基本上能够满足我的需求了,就没有继续深化。

/(http|ftp|https):\/\/([\w\d\-_]+[\.\w\d\-_]+)[:\d+]?([\/]?[\w\/\.\?=&;%@#\+,]+)/i

使用括号的好处是,在处理结果时,可以很容易的获取到协议、域名、相对路径这些内容,方便后续的处理。

例如使用 preg_match_all() 匹配时,结果数组索引0为全部结果、1为协议、2为域名、3为相对路径

以上就是使用PHP的正则抓取页面中的网址的全部内容,希望对大家在PHP使用中有所帮助。

PHP 相关文章推荐
smarty section简介与用法分析
Oct 03 PHP
PHP 开发环境配置(Zend Server安装)
Apr 28 PHP
php学习之运算符相关概念
Jun 09 PHP
需要注意的几个PHP漏洞小结
Feb 05 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 PHP
php 实现进制相互转换
Apr 07 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
浅析PHP中的i++与++i的区别及效率
Jun 15 PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 PHP
php阳历转农历优化版
Aug 08 #PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 #PHP
常用PHP数组排序函数归纳
Aug 08 #PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
Aug 08 #PHP
PHP 5.6.11中CURL模块问题的解决方法
Aug 08 #PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 #PHP
微信公众号开发之文本消息自动回复php代码
Aug 08 #PHP
You might like
介绍php设计模式中的工厂模式
2008/06/12 PHP
php curl基本操作详解
2013/07/23 PHP
php分页查询的简单实现代码
2017/03/14 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
sina的lightbox效果。
2007/01/09 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
Javascript中神奇的this
2016/01/20 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
Python编程实现正则删除命令功能
2017/08/30 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
python实现图书借阅系统
2019/02/20 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
Python tkinter和exe打包的方法
2020/02/05 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
银行开户授权委托书格式
2014/10/10 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
超级详细实用的pycharm常用快捷键
2021/05/12 Python
JAVA springCloud项目搭建流程
2022/05/11 Java/Android