正则表达式是什么
是一种字符串处理的工具(搜索匹配、搜索替换、搜索分割)
功能强大,是一种规则
正则表达式应用范围
数据验证
数据处理/过滤
数据查询
各语言(js/php/java/c#)都支持
正则表达式PHP相关函数
preg_filter ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) //正则表达式一个匹配,返回匹配结果的次数
preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] ) //执行一个全局正则表达式匹配,返回匹配结果的次数
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) //执行一个正则表达式的搜索和替换
preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] ) //执行一个正则表达式搜索并且使用一个回调进行替换
preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] ) //通过一个正则表达式分隔字符串
preg_quote ( string $str [, string $delimiter = NULL ] ) //转义正则表达式字符
preg_grep ( string $pattern , array $input [, int $flags = 0 ] ) //返回给定数组input中与模式pattern匹配的元素组成的数组.
正则表达式组成
定界符
一般使用'/',但不限于此
除字母、数字、反斜杠'\'的其他字符都可以作为定界符
原子
. 匹配除换行符之外任意字符
\d 匹配任意一个十进制数字
\D 匹配任意一个非十进制数字
\s 匹配一个不可见原子
\S 匹配一个可见原子
\w 匹配任意一个数字、字母或下划线[a-zA-Z0-9_]
\W 匹配任意非一个数字、字母或下划线[^a-zA-Z0-9_]
[] 作为一个原子,匹配[]之间的一个原子
[^] 作为一个原子,不能匹配[]之间的一个原子
元字符
//量词
{n} 匹配原子恰好出现n次
{n,} 匹配原子出现不少于n次
{n,m} 匹配原子出现至少n次,最多m次
* 相当于{0,}
+ 相当于{1,}
? 相当于{0,1}
//边界限制
^ 指定匹配的字符串以什么原子开头
$ 指定匹配的字符串以什么原子结尾
//模式选择符
| 多选一
//模式单元
() 多原子作为一个大原子
模式修正符
i //不区分大小写
s //正则表达式中.匹配所有字符,包括换行符
U //匹配模式变为懒惰模式(只有PHP有,其他语言不兼容,请使用.*?)
x //空白忽略
preg_filter与preg_replace区别
当匹配的目标数据是数组时,preg_filter只返回匹配的数组元素,preg_replace返回所有数组元素
正则表达式例子
非空判断
$pattern = '/\\S+/';
$ret = preg_match($pattern,' ');//false为空
去除空格
$str = '你是谁 2 年后';
$pattern = '/\\s+/';
$ret = preg_replace($pattern,'',$str);
手机号匹配
$pattern = '/^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\\d{8}$/';
//匹配移动
$pattern = '^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\\d{8}$';
//匹配联通
$pattern = '^1(3[0-2]|4[5]|5[56]|7[0156]|8[56])\\d{8}$';
//匹配电信
$pattern = '^1(3[3]|4[9]|53|7[037]|8[019])\\d{8}$';
email匹配
$pattern = '/^(\w)+(\.\w+)*@(\w)+(\.\w+)+$/';
URL验证(http/https)
$pattern = '/^https?\:////(\w+\.)+[a-z]+$/';
正则表达式使用场景——模板引擎
实现原理
1、获取模板源文件
2、编译模板并输出到文件(用正则替换,文件讲保存编译后的模板代码html+php)
3、执行编译后的模板文件(将得到html,如果要做静态化就在此步)
4、输出模板
简单实现步骤
1、建立2个文件夹(一个存放模板源文件、一个存放模板编译文件)
2、读取模板源文件 $outputHtml = file_put_contents($filePath);
3、使用正则进行模式替换,然后用一个新文件存储起来
正则进行模式替换
$str = '测试:{{$test}}';
$pattern = '/\{\{ *\$(\w+) *\}\}/';
$arr = preg_replace($pattern,'<?php echo $\\1;?>',$str);
//最后$arr="测试:<?php echo $test;?>"
//除可以使用\\1,也可以使用$1
//得到字符串需要动态执行,可以使用eval(),否则不执行,但eval()不能有php开始/关闭标签
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。