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+MSSQL分页的例子
Oct 09 PHP
PHP中替换换行符的几种方法小结
Oct 15 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
Apr 26 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
PHP捕获Fatal error错误的方法
Jun 11 PHP
php随机取mysql记录方法小结
Dec 27 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
php+ajax登录跳转登录实现思路
Jul 31 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 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
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
javascript 隔行换色函数代码
2010/10/24 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
js实现3D旋转相册
2020/08/02 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python用UUID库生成唯一ID的方法示例
2016/12/15 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
人事专员的职责
2014/02/26 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
学籍证明模板
2015/06/18 职场文书
二胎满月酒致辞
2015/07/29 职场文书
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python