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过滤危险html代码的函数
Jul 22 PHP
优化PHP程序的方法小结
Feb 23 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
php随机显示图片的简单示例
Feb 15 PHP
Yii获取当前url和域名的方法
Jun 08 PHP
php 截取utf-8格式的字符串实例代码
Oct 30 PHP
详解Yii实现分页的两种方法
Jan 14 PHP
PHP实现随机数字、字母的验证码功能
Aug 01 PHP
PHP获取HTTP body内容的方法
Dec 31 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
Oct 15 PHP
Laravel 错误提示本地化的实现
Oct 22 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
体育彩票排列三组选三算法分享
2014/03/07 PHP
php中Snoopy类用法实例
2015/06/19 PHP
ECMAScript 基础知识
2007/06/29 Javascript
Javascript倒计时代码
2010/08/12 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
jquery实现倒计时效果
2015/12/14 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
RequireJS使用注意细节
2016/05/15 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
python基础教程之序列详解
2014/08/29 Python
Python的Flask框架中web表单的教程
2015/04/20 Python
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
python求绝对值的三种方法小结
2019/12/04 Python
Python解析多帧dicom数据详解
2020/01/13 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
十岁生日父母答谢词
2014/01/18 职场文书
在校生自我鉴定
2014/01/23 职场文书
商超业务员岗位职责
2014/03/12 职场文书
个人工作能力自我评价
2015/03/05 职场文书
大学生求职意向书
2015/05/11 职场文书
学术会议开幕词
2016/03/03 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书
Python Pandas解析读写 CSV 文件
2022/04/11 Python