浅谈正则表达式-PHP为例
第一次比较系统的学习正则表达式,本篇文章以PHP语言为例来学习。
基本概念
正则表达式=普通字符(如a-z)+分隔符(正斜线(/)、hash符号(#) 以及取反符号(~))+特殊字符(称为元字符) 两者的组合;
PHP的正则有两种:POSIX和PERL(PCRE Perl Compatible Regular Expression),后者PHP支持得更好
匹配原理
简单描述下,通常是由字符串位置0开始尝试匹配,若匹配成功存储这个子串;若在某一个位置匹配失败则后移一个位置,从位置1开始重新匹配。直到匹配成功或者匹配到最后一个位置都没有找到成功的子串。
匹配模式
看名字,是不是想到了设计模式中的单例模式了呢?
- 贪婪模式
在可匹配与可不匹配的时候,优先匹配,比如量词用*或+
2. 懒惰模式
在可匹配与可不匹配的时候,优先不匹配,比如量词用?。 *? 在正则中代表非贪婪匹配模式,会尽量少的匹配字符,如果不加 ?就是贪婪模式,此时通配符会把所有字符都匹配掉
用途
- 查找:检查一个串是否包含某个子串,而子串是符合正则表达式条件的子串,最后得到所有符合条件的子串集合
- 替换:将上一条查找出来的子串替换成特定的字符串
正则分隔符
字符 | 说明 | 备注 |
/表达式/ | 一个完整的正则表达式的边界 | 若表达式内有/,需要用转义字符\转义 $p="/ab\//" |
#表达式# | 一个完整的正则表达式的边界2 | 若表达式内有#,需要用转义字符\转义 $p="#ab/\##" |
~表达式~ | 一个完整的正则表达式的边界3 | 若表达式内有~,需要用转义字符\转义 $p="~ab/#\~~" |
|表达式| | 一个完整的正则表达式的边界4 | 若表达式内有|,需要用转义字符\转义 $p="|ab/#\~\||" |
元字符
边界定位符
字符 | 说明 | 备注 |
^开头, | 用于子字符串的末尾,,表示子字符串必须出现在字符串的开头 | 见代码示例1 |
$结尾 | 用于子字符串的末尾,,表示子字符串必须出现在字符串的末尾,可以和^搭配使用 | |
\b | 匹配一个单词边界,匹配单词和空格之间的位置 | |
\B | 匹配一个非单词边界,匹配单词和空格之间的位置 |
量词元字符
字符 | 说明(都是返回能得到的最长子串) | 备注 |
* | 0次或多次匹配前面的子表达式, | 等价于{0,} |
? | 0次或1次匹配前面的子表达式 | 等价于{0,1}懒惰模式就用这个 |
+ | 1次或多次匹配前面的子表达式 | 等价于{1,} |
{n} | n次匹配前面的子表达式 | |
{n,} | 大于等于n次匹配前面的子表达式 | |
{,n} | 小于等于n次匹配前面的自表达式 | |
{n,m} | 最少n次,最大m次,匹配前面的自表达式 |
普通元字符
字符 | 说明 | 备注 |
\d | 数字,等价于[0-9] | digit |
\D | 非数字,等价于[^0-9] | |
\w | 匹配字母、数字、下划线,等价于[a-zA-z0-9_] | word |
\W | 匹配非[^a-zA-z0-9_] | |
\s | 匹配任何空白字符(包括空格、制表符、换页符),等价于[\n\f\t\r\v] | space |
\S | 匹配任何非空白字符(包括空格、制表符、换页符),等价于[^\n\f\t\r\v] | |
\ | 转义字符 | |
. | 匹配除换行符(\n)之外的任何字符 |
当一个字符类的开始或末尾处使用点号时,只能成为普通的点号字符 |
[] |
只能匹配一个字符,自带“或”的属性,后面可以跟修饰符。 方括号内,个别字符有不同的含义: ^仅在作为第一个字符(方括号内)时,表明字符类取反 - 标记字符范围 \ 转义字符 |
|
() | 包含一个子表达式,要表达“或”需要“|” | |
| | 开始一个可选分支 |
分组元字符
字符 | 说明 | 备注 |
() | 将表达式括起来,与其他元字符配合使用 |
引用
字符 | 说明 | 备注 |
& | 在替换字符串中,符号&代表整个正则表达式所匹配的字符串的内容 | 仅在替换时使用 |
\n(n=1,2...) | 转移数字\n代表索索字符串的第n个括号中正则表达式所匹配的字符串内容 | 查找、替换都能使用 |
各元字符的优先级
优先级 | 字符集 | 说明 |
1 | \ | 转义 |
2 | ^\w\d等 | |
3 | (),[] | |
4 | *,+,?,{} | 两次 |
5 | ^,$ | 断言,位置 |
6 | | | 分组 |
PHP中正则相关的几个方法
1.preg_match($pattern, $subject, $matches);
用途:返回值是匹配成功的次数0或者1,在匹配到1次以后就会停止搜索
参数:$pattern 为正则表达式;$subject为被搜索的字符串;$matches可选,存储匹配结果的数组,$matches[0]包含整个模式匹配的文本,$matches[1]为第一个括号中的子模式所匹配的文本,依次类推
代码示例:
$subject = "abcdef";
$pattern = '/a(.*)(\w)d/';
preg_match($pattern, $subject, $matches);
print_r($matches);
返回结果:
Array
(
[0] => abcd
[1] => b
[2] => c
)
2.preg_match_all($pattern, $subject, $matches,$flags]);
用途:循环获取一个列表的匹配结果数组。
参数:$pattern 为正则表达式;$subject为被搜索的字符串;
$matches必选,存储匹配结果的多维数组
$flags有多个值,int类型。
case: flag=1,PREG_PARTTERN_ORDER 默认值,$matches[0]存储的是全部模式匹配的数组,$matches[1]为第一个括号中的子模式所匹配的文本array,依次类推。
$p = "|<[^>]+>(.*?)</[^>]+>|i";
$str = "<b>example: </b><div align=left>this is a test</div>";
preg_match_all($p, $str, $matches,1);
print_r($matches);
运行结果:
Array
(
[0] => Array
(
[0] => <br>example: </br>
[1] =><div>this is a test</div>
)
[1] => Array
(
[0] => example:
[1] => this is a test
)
)
case: flag=2,PREG_SET_ORDER ,$matches[0]存储的是第一括号里面模式匹配的所有数组,$matches[1]为第而括号里面模式匹配的所有数组,依次类推。
代码示例:
$p = "|<[^>]+>(.*?)</[^>]+>|i";
$str = "<b>example: </b><div align=left>this is a test</div>";
preg_match_all($p, $str, $matches,2);
print_r($matches);
运行结果:
Array
(
[0] => Array
(
[0] => <br>example: </br>
[1] => example:
)
[1] => Array
(
[0] =><div>this is a test</div>
[1] => this is a test
)
)
3.preg_replace($pattern, $replacement, $string);
用途:找到一个字符串匹配的子串,并交换子串之间的位置。
参数:第一个参数表示正则表达式;第二个参数表示新的位置,$1 表示所以父正则表达式list的每个元素的第一个子元素;第三个参数表示源字符串。
返回:$string
$string = 'April 15, 2014;July 16, 2015';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$3, ${1} $2';
preg_match_all($pattern,$string,$matches,2);
print_r($matches);
echo preg_replace($pattern, $replacement, $string);
结果:
Array
(
[0] => Array
(
[0] => April 15, 2014
[1] => April
[2] => 15
[3] => 2014
) [1] => Array
(
[0] => July 16, 2015
[1] => July
[2] => 16
[3] => 2015
) )
2014, April 15;2015, July 16
常用示例
1.匹配邮箱:
'/^[a-zA-z_\-.]+@[a-zA-z_\-.]+\.[a-zA-z_\-.]+$/'
或 '/^[\w\-.]+@[\w\-.]+\.[\w\-.]+$/'
tips:在中括号末尾的的. 是不需要转移字符的,而在中括号外的.就一定要记得加上转义
2. ^$间隔符加深理解:
$str="abcdae";
$p1='/^ab/';
$p2='/^a$/';
echo preg_match($p1,$str);//1
echo preg_match($p2,$str);//0
3.常用的一个注册页面的验证
$user = array(
'name' => 'spark1985',
'email' => 'spark@imooc.com',
'mobile' => '13312345678'
);
//进行一般性验证
if (empty($user)) {
die('用户信息不能为空');
}
if (strlen($user['name']) < 6) {
die('用户名长度最少为6位');
}
//用户名必须为字母、数字与下划线
if (!preg_match('/^\w+$/i', $user['name'])) {
die('用户名不合法');
}
//验证邮箱格式是否正确
if (!preg_match('/^[\w\.]+@\w+\.\w+$/i', $user['email'])) {
die('邮箱不合法');
}
//手机号必须为11位数字,且为1开头
if (!preg_match('/^1\d{10}$/i', $user['mobile'])) {
die('手机号不合法');
}
echo '用户信息验证成功';
RegisterPage
浅谈正则表达式-PHP为例的更多相关文章
- Day 10:浅谈正则表达式
正则表达式 以检验扣扣号是否合法为例引入正则表达式 要求:校验QQ号,要求:必须是5~15位数字,0不能开头. 1.没有正则表达式 public class Demo1 { public static ...
- 浅谈cocos2dx(17) 中单例管理模式
----我的生活,我的点点滴滴!. 首先明白一个问题.什么是管理者模式,管理类是用来管理一组相关对象的类,他提供了訪问对象的接口,假设这么说比較抽象的话.我们来看下cocos2dx中都有哪些类是管理类 ...
- 浅谈Java正则表达式
正则表达式我们都知道,它定义了字符串的模式,可以用来搜索.编辑或处理文本.我们在某些特定场景中用起来是非常方便的.它等于是给我们划定了一个范围,让我们可以精准的匹配到我们想要的结果.比如我想判断一个几 ...
- 浅谈JavaScript中的正则表达式(适用初学者观看)
浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
- Linux的文本处理工具浅谈-awk sed grep
Linux的文本处理工具浅谈 awk 老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 浅谈 DDoS 攻击与防御
浅谈 DDoS 攻击与防御 原创: iMike 运维之美 什么是 DDoS DDoS 是英文 Distributed Denial of Service 的缩写,中文译作分布式拒绝服务.那什么又是拒 ...
- MYSQL优化浅谈,工具及优化点介绍,mysqldumpslow,pt-query-digest,explain等
MYSQL优化浅谈 msyql是开发常用的关系型数据库,快速.稳定.开源等优点就不说了. 个人认为,项目上线,标志着一个项目真正的开始.从运维,到反馈,到再分析,再版本迭代,再优化… 这是一个漫长且考 ...
随机推荐
- java跨服务器请求url获得数据
在项目中,有时需要通过请求远程服务器上的url获取数据(前提是程序所在服务器可以和url服务器ping成功), 用java在后台发送请求时,用到了java.net.URL, java.net.URLC ...
- 批量上传图片(jQuery-File-Upload使用)
jQuery-File-Upload jQuery-File-Upload是一个jquery下的ajax文件上传插件,支持批量上传,github地址:https://github.com/blueim ...
- DNSSec
Domain Name System Security Extensions (DNSSEC)DNS安全扩展,是由IETF提供的一系列DNS安全认证的机制(可参考RFC2535).它提供了一种来源鉴定 ...
- RedHatEnterpriseLinuxServerRelease7.3上配置vsftpd服务器
0.vsftpd与ftp安装 yum install -y vsftpd ftp 1.vsftpd 服务启停相关命令 systemctl start vsftpd systemctl stop vsf ...
- ios开发3.5和4.0寸屏幕自适应中的一点问题
在开发iso应用中需要考虑到ip4的3.5寸屏幕和ip5的4寸屏幕的高度不一样的问题.常见的问题有滚动条位置,底部被挡住等情况:我遇见是tableview中添加下拉上提刷新功能时刷新指示器显示位置的问 ...
- USACO Section1.2 Name That Number 解题报告
namenum解题报告 —— icedream61 博客园(转载请注明出处)-------------------------------------------------------------- ...
- 每天一个Linux命令(11):cat命令
cat命令连接文件并打印到标准输出设备上. 注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容.因此,一般用more等命令分屏显示.为了控制滚屏,可以按Ctrl+S键,停止滚 ...
- 常用模块(random)
import randomimport string# dt = random.randint(1,2) # 从1-2间取随机数,包括1.2# dt = random.randrange(1,3) # ...
- python 3 使用cmp函数报错
python3 中已经不使用cmp函数进行比较大小,使用operator模块 import operator lt(a,b) 相当于 a<b 从第一个数字或字母(ASCII)比大小 le(a,b ...
- ajax-高设3
ajax 1.XHR Ajax 技术的核心是 XMLHttpRequest 对象(简称 XHR),这是由微软首先引入的一个特性,其他浏览器提供商后来都提供了相同的实现.在 XHR 出现之前,Ajax ...