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+MYSQL 出现乱码的解决方法
Aug 08 PHP
PHP strtr() 函数使用说明
Nov 21 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
Apr 28 PHP
php校验表单检测字段是否为空的方法
Mar 20 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
详解PHP实现异步调用的4种方法
Mar 14 PHP
Zend Framework开发入门经典教程
Mar 23 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
Laravel框架查询构造器简单示例
May 08 PHP
laravel框架语言包拓展实现方法分析
Nov 22 PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Mar 29 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面试题集锦
2012/03/08 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
JavaScript运算符小结
2015/06/03 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
axios学习教程全攻略
2017/03/26 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
Python使用gensim计算文档相似性
2016/04/10 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
python基于递归解决背包问题详解
2019/07/03 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
大学生职业生涯规划范文
2014/01/08 职场文书
社区党建工作方案
2014/06/10 职场文书
婚宴邀请函
2015/01/30 职场文书
大学生学年个人总结
2015/02/15 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS