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 相关文章推荐
apache mysql php 源码编译使用方法
May 03 PHP
PHP Class&Object -- 解析PHP实现二叉树
Jun 25 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
常用PHP框架功能对照表
Oct 23 PHP
PHP 使用memcached简单示例分享
Mar 05 PHP
基于PHP实现商品成交时发送短信功能
May 11 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
May 26 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
php面向对象之反射功能与用法分析
Mar 29 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
phpinfo无法显示的原因及解决办法
Feb 15 PHP
PHP代码加密的方法总结
Mar 13 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
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
JavaScript高级程序设计
2006/12/29 Javascript
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
重载toString实现JS HashMap分析
2011/03/13 Javascript
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
python实现连连看辅助(图像识别)
2020/03/25 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
python安装sklearn模块的方法详解
2020/11/28 Python
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
2015年团支部工作总结
2015/04/03 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
HTML基础详解(下)
2021/10/16 HTML / CSS
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA