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 相关文章推荐
PHP4之COOKIE支持详解
Oct 09 PHP
PHP脚本中include文件出错解决方法
Nov 20 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
PHP安装threads多线程扩展基础教程
Nov 17 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
Jul 13 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
Nov 15 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
Dec 09 PHP
PC端微信扫码支付成功之后自动跳转php版代码
Jul 07 PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 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抽象类使用要点与注意事项分析
2015/02/09 PHP
PHP中的session安全吗?
2016/01/22 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
详解JS面向对象编程
2016/01/24 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python中的生成器和yield详细介绍
2015/01/09 Python
Python的函数的一些高阶特性
2015/04/27 Python
用Python编写web API的教程
2015/04/30 Python
python简单获取数组元素个数的方法
2015/07/13 Python
浅述python2与python3的简单区别
2018/09/19 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
2020/02/18 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
德语专业求职信
2014/03/12 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python