PHP下正则表达式整理

正则表达式的历史背景

  1. 内容深厚的正则表达式
    ^.+@.+\\..+$ 形式,字符串搜索与匹配的工具
  2. 应用范围
    手机输入法、Windows文件搜索、linux 列出文件命令、网站用户注册,如邮箱、手机号码的表单验证等

正则表达式函数解析

  1. 准备工作,在此选择 php 来学习正则表达式
  2. 事先建立好一个 show() 函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 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;
}
}
  1. php 中常用的正则表达式函数(使用最频繁),返回匹配到的次数
  • preg_match($pattern, $subject, [array &$matches]) 只会匹配一次,preg_match_all($pattern, $subject, array &$matches) 匹配所有
    以下是代码实例
1
2
3
4
5
6
7
8
9
10
11
$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); //输出一个二维数组
  • preg_replace($pattern, $replacement, $subject)preg_filter($pattern, $replacement, $subject)
    代码实例
1
2
3
4
5
6
7
8
9
10
$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 );
  • preg_grep($pattern, array $input)将无法匹配的值过滤掉 阉割版 preg_filter()

  • preg_split($pattern, $subject)
    代码实例

1
2
3
4
5
6
7
8
9
10
11
12
13
$pattern = '/[0-9]/';
$subject = '这9是2一段3文5字';
$arr = preg_split($pattern, $subject);
show($arr);
// 输出
Array
(
[0] => 这
[1] => 是
[2] => 一段
[3] => 文
[4] => 字
)
  • preg_quote($str)
    正则运算符转义

  • 正则表达式总结
    都以preg_开头
    preg_quote() 外,第一个参数都是正则表达式
    preg_match() 表单验证
    preg_replace () 非法词汇过滤等

模式修正

  1. 概述
    界定符、原子、量词、边界控制、模式单元
  2. 界定符
    表示正则表达式开始和结束的位置
1
2
3
$pattern = '/[0-9]/';
$pattern = '#[0-9]#';
$pattern = '{[0-9]}'; //在php中不推荐使用
  1. regexpal 工具
    用于调试正则表达式  
  2. 原子概念
    正则匹配最小单位
    可见原子:键盘输出后肉眼可见的字符
    不可见原子:换行符、回车、空格
    在匹配中文字符时,建议先转换 Unicode http://tool.chinaz.com/Tools/Unicode.aspx

  3. 原子的筛选方式
    | 匹配两个或多个分支选择
    [] 匹配方括号中的任意一个原子 ,[789] 匹配 789 ,[a-zA-Z0-9]匹配字母和数字
    [^]匹配方括号中的原子之外的任意字符 [^789] 匹配非 789   

  4. 元字符(原子的集合)
    . 匹配除换行符之外的任意字符
    \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
    ]

  5. 量词
    {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到无穷大次数字出现

  6. 边界控制
    ^匹配字符串开始的位置
    $匹配字符串结束的位置
    () 匹配其中的整体为一个原子

  7. 修正模式
    贪婪匹配 匹配结果有歧义时取其长
    懒惰匹配 匹配结果有歧义时取其短 标识 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]+$

正则表达式实战——正则表达式工具类

1
2
3
4
5
6
7
8
9
10
11
'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}$/'