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作为Shell脚本语言使用
Oct 09 PHP
截获网站title标签之家内容的例子
Oct 09 PHP
PHP获取类中常量,属性,及方法列表的方法
Apr 09 PHP
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
php生成随机密码的几种方法
Jan 17 PHP
基于PHP array数组的教程详解
Jun 05 PHP
探讨如何在php168_cms中提取验证码
Jun 08 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 PHP
分享50个提高PHP执行效率的技巧
Dec 26 PHP
关于Laravel Route重定向的一个注意点
Jan 16 PHP
PHP实现添加购物车功能
Mar 06 PHP
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
Apr 01 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 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php whois查询API制作方法
2011/06/23 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
JavaScript中SetInterval与setTimeout的用法详解
2015/11/10 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
vue实现验证码输入框组件
2017/12/14 Javascript
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python编程中的异常处理教程
2015/08/21 Python
Python实现的堆排序算法示例
2018/04/29 Python
python生成随机红包的实例写法
2019/09/02 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
python实现同一局域网下传输图片
2020/03/20 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
动态密码技术
2012/10/18 面试题
2014年督导工作总结
2014/11/19 职场文书
药店收银员岗位职责
2015/04/07 职场文书