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+oracle 分页类
Oct 09 PHP
改进的IP计数器
Oct 09 PHP
php smarty 二级分类代码和模版循环例子
Jun 01 PHP
php 目录遍历、删除 函数的使用介绍
Apr 28 PHP
PHP使用ob_start生成html页面的方法
Nov 07 PHP
PHP开发Apache服务器配置
Jul 15 PHP
学习php设计模式 php实现适配器模式
Dec 07 PHP
php中this关键字用法分析
Dec 07 PHP
PHP基础之输出缓冲区基本概念、原理分析
Jun 19 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
Jan 07 PHP
Yii框架组件的事件机制原理与用法分析
Apr 07 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实现统计二进制中1的个数算法示例
2018/01/23 PHP
php依赖注入知识点详解
2019/09/23 PHP
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
javascript生成大小写字母
2015/07/03 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
调试Python程序代码的几种方法总结
2015/04/28 Python
Python中functools模块的常用函数解析
2016/06/30 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
python实现输入数字的连续加减方法
2018/06/22 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
在pytorch中动态调整优化器的学习率方式
2020/06/24 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
艺术应用与设计个人的自我评价
2013/11/23 职场文书
生产现场工艺工程师岗位职责
2013/11/28 职场文书
年度考核评语
2014/01/19 职场文书
教师工作失职检讨书
2014/09/18 职场文书
导游词之天津盘山
2019/11/01 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js