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实际应用经验篇(7)
Oct 09 PHP
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
PHP session有效期session.gc_maxlifetime
Apr 20 PHP
PHP转换IP地址到真实地址的方法详解
Jun 09 PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 PHP
用 Composer构建自己的 PHP 框架之基础准备
Oct 30 PHP
php使用指定编码导出mysql数据到csv文件的方法
Mar 31 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
Jul 01 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
PHP实现文件上传下载实例
Oct 18 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 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写MySQL数据 实现代码
2009/06/15 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
php修改数组键名的方法示例
2017/04/15 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
extJs 下拉框联动实现代码
2010/04/09 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
js实现删除json中指定的元素
2020/09/22 Javascript
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
python正则表达式之作业计算器
2016/03/18 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
基本款天堂:Everlane
2017/05/13 全球购物
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
解释下面关于J2EE的名词
2013/11/15 面试题
校园广播稿500字
2014/02/04 职场文书
大学军训感言1000字
2014/02/25 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
Go语言应该什么情况使用指针
2021/07/25 Golang
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL