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 相关文章推荐
用PHP动态生成虚拟现实VRML网页
Oct 09 PHP
php FPDF类库应用实现代码
Mar 20 PHP
利用php实现禁用IE和火狐的缓存问题
Dec 03 PHP
PHP制作百度词典查词采集器
Jan 29 PHP
php使用curl获取https请求的方法
Feb 11 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
教你php如何实现验证码
Jan 20 PHP
php+html5实现无刷新图片上传教程
Jan 22 PHP
php数组分页实现方法
Apr 30 PHP
Yii框架常见缓存应用实例小结
Sep 09 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 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实现 上一篇、下一篇的代码
2012/09/29 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
2016/12/10 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
js推箱子小游戏步骤代码解析
2018/01/10 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
JS实现放烟花效果
2020/03/10 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
Python 字典与字符串的互转实例
2017/01/13 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
python识别验证码图片实例详解
2020/02/17 Python
python爬虫容易学吗
2020/06/02 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
全世界最美丽的四星和五星级酒店预订:Prestigia.com
2017/11/15 全球购物
捐款倡议书
2014/04/14 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
临时用工协议书范本
2014/10/29 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL