一、正则表达式的历史背景
1,内容深厚的正则表达式
^[email protected]+\\..+$ 形式
字符串搜索与匹配的工具
2,应用范围
手机输入法
Windows文件搜索
linux 列出文件命令
网站用户注册,如邮箱、手机号码的表单验证
-------------------------------------------------------
二、正则表达式函数解析
1,准备工作,在此选择 php 来学习正则表达式
2,事先建立好一个 show() 函数
/**
* description: php正则表达式函数
*/
/**
* @name:show
* @description : output debug
* @param $var : input data
* @return void
*/
function show($var = null){
if ( empty( $var ) ) {
echo ‘null‘;
} elseif( is_array($var) || is_object($var) ){
echo "<pre>";
print_r($var);
echo "</pre>";
} else{
echo $var;
}
}
3,php 中常用的正则表达式函数(使用最频繁),返回匹配到的次数
(1)preg_match($pattern, $subject, [array &$matches]) 只会匹配一次
preg_match_all($pattern, $subject, array &$matches) 匹配所有
以下是代码实例
$pattern = ‘/[0-9]/‘;
$subject = ‘hdgsah7ghgsj89gsgh7faf432‘;
$m1 = $m2 = array();
$t1 = preg_match($pattern, $subject, $m1); //$t1 = 1
$t2 = preg_match_all($pattern, $subject, $m2); //$t2 = 7
show($m1); //输出一个一维数组
echo "<hr>";
show($m2); //输出一个二维数组
(2)preg_replace($pattern, $replacement, $subject)
preg_filter($pattern, $replacement, $subject)
代码实例
$pattern = array(‘/[0123]/‘,‘/[456]/‘,‘/[789]/‘);
$subject = array(‘hdg‘,‘sah7‘,‘ghgsj‘,‘89gsg‘,‘h7fa‘,‘f432‘);
$replacement = array(‘你‘,‘好‘,‘!‘);
$str1 = preg_replace($pattern, $replacement, $subject);
$str2 = preg_filter($pattern, $replacement, $subject);
show( $str1 );
echo "<hr>";
show( $str2 );
(3) preg_grep($pattern, array $input)将无法匹配的值过滤掉 阉割版 preg_filter()
(4) preg_split($pattern, $subject)
代码实例
$pattern = ‘/[0-9]/‘;
$subject = ‘这9是2一段3文5字‘;
$arr = preg_split($pattern, $subject);
show($arr);
输出
Array
(
[0] => 这
[1] => 是
[2] => 一段
[3] => 文
[4] => 字
)
(5)preg_quote($str)
正则运算符转义
(6)正则表达式总结
a,都以preg_开头
b,除preg_quote() 外,第一个参数都是正则表达式
c,preg_match() 表单验证
d,preg_replace () 非法词汇过滤等
三、模式修正
1,概述
界定符、原子、量词、边界控制、模式单元
2,界定符
表示正则表达式开始和结束的位置
$pattern = ‘/[0-9]/‘;
$pattern = ‘#[0-9]#‘;
$pattern = ‘{[0-9]}‘; //在php中不推荐使用
3, regexpal 工具
用于调试正则表达式
4,原子概念
正则匹配最小单位
可见原子:键盘输出后肉眼可见的字符
不可见原子:换行符、回车、空格
在匹配中文字符时,建议先转换 Unicode http://tool.chinaz.com/Tools/Unicode.aspx
5,原子的筛选方式
| 匹配两个或多个分支选择
[] 匹配方括号中的任意一个原子 [789] 匹配 789 , [a-zA-Z0-9] 匹配字母和数字
[^] 匹配方括号中的原子之外的任意字符 [^789] 匹配非 789
6,元字符(原子的集合)
. 匹配除换行符之外的任意字符
\d 匹配任意一个十进制数字,即 [0-9]
\D 匹配除数字之外的其他字符
\s 匹配一个不可见原子 即[\f\n\r\t\v]
\S 匹配一个可见的原子 [^\f\n\r\t\v]
\w 匹配任意一个数字、字母、或下划线 [0-9a-zA-Z_]
\W 匹配任意一个非数字、字母、或下划线 [^0-9a-zA-Z_]
7,量词
{n} 表示其前面的原子恰好出现 n 次
{n,} 表示其前面的原子最少出现 n 次
{n,m} 表示其前面的原子最少出现 n 次,最多出现 m 次
* 匹配0次,1次或多次其之前的原子 即 {0,}
+ 匹配1次或多次其之前的原子 即 {1,}
? 匹配0次或1次其之前的原子
举例子 5{2} ---- 55
[a-zA-Z]{2} ---- ad1256135AW
[\w]{4} ---- 连续出现4次字母、数字、下划线
[\w]{4,8} ---- 4到8次字母、数字、下划线
\d+ ---- 1到无穷大次数字出现
8 ,边界控制
^ 匹配字符串开始的位置
$ 匹配字符串结束的位置
() 匹配其中的整体为一个原子
9,修正模式
贪婪匹配 匹配结果有歧义时取其长
懒惰匹配 匹配结果有歧义时取其短 标识 U
i 忽略英文大小写
x 匹配过程中忽略空白 ,包括空格和制表符
s 让元字符‘ . ‘匹配包括换行符在内的所有字符
四、正则表达式实战
1,非空: .+
2, 匹配一个保留两位小数的浮点数: \d+\.\d{2}$
3, 大陆手机号: ^1(3|5|4|7|8)\d{9}
4, email地址: ^\w+(\.\w)*@\w+(\.\w)+$
5,url 地址: ^(https?://)?(\w+\.)+.[a-zA-Z]+$
五、正则表达式实战——正则表达式工具类
‘require‘ => ‘/.+/‘,
‘email‘ => ‘/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/‘,
‘url‘ => ‘/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\‘:+!\.#\w]*)?$/‘,
‘currency‘ => ‘/^\d+(\.\d+)?$/‘,
‘number‘ => ‘/^\d+$/‘,
‘zip‘ => ‘/^\d{6}$/‘,
‘integer‘ => ‘/^[-\+]?\d+$/‘,
‘double‘ => ‘/^[-\+]?\d+(\.\d+)?$/‘,
‘english‘ => ‘/^[A-Za-z]+$/‘,
‘qq‘ => ‘/^\d{5,11}$/‘,
‘mobile‘ => ‘/^1(3|4|5|7|8)\d{9}$/‘