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扩展图文教程
Dec 12 PHP
常用的PHP数据库操作方法(MYSQL版)
Jun 08 PHP
PHP Session 变量的使用方法详解与实例代码
Sep 11 PHP
PHP禁止个别IP访问网站
Oct 30 PHP
thinkphp模板用法和内容输出实例
Nov 28 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
May 30 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 03 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比较操作符的安全问题
2015/12/03 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
js编写简易的计算器
2020/07/29 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
Python 自动刷博客浏览量实例代码
2017/06/14 Python
Python多进程fork()函数详解
2019/02/22 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python输出带颜色字体实例方法
2019/09/01 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
医学护理毕业生自荐信
2013/11/07 职场文书
二年级小学生评语
2014/04/21 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
领导干部对照检查材料
2014/08/24 职场文书
五一劳动节慰问信
2015/02/14 职场文书
2015年读书月活动总结
2015/03/26 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
MySQL系列之十一 日志记录
2021/07/02 MySQL