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编程开发“虚拟域名”系统
Oct 09 PHP
Email+URL的判断和自动转换函数
Oct 09 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
Apr 17 PHP
54个提高PHP程序运行效率的方法
Jul 19 PHP
PHP中Closure类的使用方法及详解
Oct 09 PHP
PHP内核探索之解释器的执行过程
Dec 22 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
对PHP依赖注入的理解实例分析
Oct 09 PHP
PHP调用其他文件中的类
Apr 02 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
php array_intersect()函数使用代码
2009/01/14 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
PHP读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
在Django的模型中添加自定义方法的示例
2015/07/21 Python
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
python 基于opencv操作摄像头
2020/12/24 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
学雷锋活动总结报告
2014/06/26 职场文书
2014年安全生产责任书
2014/07/22 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书