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 相关文章推荐
我常用的几个类
Oct 09 PHP
php操作sqlserver关于时间日期读取的小小见解
Nov 29 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
Jun 02 PHP
解析如何用php screw加密php源代码
Jun 20 PHP
解析php开发中的中文编码问题
Aug 08 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 PHP
php 微信开发获取用户信息如何实现
Dec 13 PHP
PHP实现统计所有字符在字符串中出现次数的方法
Oct 17 PHP
PHP的mysqli_stat()函数讲解
Jan 23 PHP
stripos函数知识点实例分享
Feb 11 PHP
laravel框架中间件 except 和 only 的用法示例
Jul 12 PHP
PHP的JSON封装、转变及输出操作示例
Sep 27 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和ACCESS写聊天室(二)
2006/10/09 PHP
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
php自定义类fsocket模拟post或get请求的方法
2015/07/31 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
一些不错的js函数ajax
2008/08/20 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
详解用JS添加和删除class类名
2019/03/25 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
python实现目录树生成示例
2014/03/28 Python
在django中,关于session的通用设置方法
2019/08/06 Python
python标准库OS模块详解
2020/03/10 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
人力资源管理系自荐信
2014/05/31 职场文书
消防标语大全
2014/06/07 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
六一亲子活动感想
2015/08/07 职场文书
python随机打印成绩排名表
2021/06/23 Python
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题