PHP正则表达式
一、正则表达式语法规则
规则表达式描述了一类字符串的特征,通过这个特征与特定的函数配合,对其他的字符串进行匹配、查找、替换以及分割操作!
这类字符串的特征是由一个或者多个
1、普通字符(比如a到z)、
2、元字符(有特殊功能的字符,比如:*,+,?等)。
等组成的一个字符串!
例如:‘/a/’ ,就是普通字符,/ 是定界符(表示正则表达式的开始和结束)
简单概括:正则表达式就是描述了一类字符串的特征,
然后通过这个特征可以配合一些特定的函数,来完成对字符串的更复杂的操作!
是由普通字符和特殊字符组成的字符串。
简单例子:
<?php
$pattern='/text/';
$str='abc';
var_dump(preg_match_all($pattern,$str,$arr));
//preg_match_all是正则表达式的函数。还有很多类似函数,之后介绍。
?>
返回:int(0)
那么以上代码的意思也就显而易见了。就是将pattern中的text在str中搜索。将结果存入arr中。
<?php
$pattern='/text/';
$str='abctextafklajtext';
var_dump(preg_match_all($pattern,$str,$arr));
?>
返回:int(2)
此时str中有两个text所以返回2.
<?php
$pattern='/text/';
$str='abctextafklajtext';
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>
返回:int(2)
array(1) { [0]=> array(2) { [0]=> string(4) "text" [1]=> string(4) "text" } }
//多输出了arr的值
定界符
我们一般用正斜线“/”作为定界的字符。
当然除了字母、数字、和反斜线以外的字符都可以作为定界符,比如:#,!,{},|,都可以!
定界符要放在正则表达式的起始位置,前后一致!
<?php
$pattern='#text#';
$str='abctextafklajtext';
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>
普通字符
比如:a-z,A-Z,0-9,双引号,单引号,他们没有特殊含义
元字符
元字符是指在正则表达式中有特殊含义的字符,常用的元字符有:
# 匹配非打印字符
$pattern = "/\n/"
# 匹配0-9数字
$pattern = "/\d/";
# 匹配除了0-9的数组
$pattern = "/\D/";
# 匹配数字+大小写字母+下划线
$pattern = "/\w/";
# 匹配除了数字、大小写字母、下划线
$pattern = "/\W/";
# 匹配空白符(换行、缩进、空格)
$pattern = "/\s/";
# 匹配除了空白符的字符
$pattern = "/\S/";
# `*` 代表匹配前面的子符出现0、1、或多次
$pattern = "so*u";
# `+` 代表匹配前面的子符出现1次、或多次
$pattern = "so+u";
# `?` 匹配前面的一个子符出现0次或者1次
$pattern = "hao?sou";
# 匹配除了换行符的任意字符
$pattern = "/./";
# 如果只想匹配 `.`,特殊含义的字符要转义。
$pattern = "/\./"
# `|`代表或者
$pattern = "/a|b|c/";
# 匹配前面的一个字符恰巧出现n次;{n}
$pattern = "/hao{2}sou/";
# 匹配前面的字符应该大于等于n次。{n,}
$pattern = "/hao{2, }sou/";
# 匹配出现2-5次
$pattern = "/hao{2, 5}sou/";
# `^` 必须以该字符开头
$pattern = "/^aaa/";
# `$` 必须以该字符结尾
$pattern = "/aaa$/";
# 严格模式
# 必须严格只能匹配aaa。
$pattern = "/^aaa$/";
# a | b | c
$pattern = "/[abc]/";
# 除了a,b,c
$pattern = "/[^abc]/";
# `()`可以看做一个整体,还可以做反向引用
# 比如要匹配协议头为http、https、ftp
$pattern = "/(http|https|ftp):\/\//";
# 匹配除了空白符的任意字符
$pattern = "/.*/";
# `.*`贪婪模式
$str = "<b>abc</b><b>abc</b>";
$pattern = "/<b>.*</b>/";
# `.*?`取消贪婪模式
$pattern = "/<b>.*?</b>/";
或:
$pattern = "/<b>.*</b>/U";
<?php
$pattern='/t\dxt/';
$str='abct1xt';
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>
返回:int(1) array(1) { [0]=> array(1) { [0]=> string(4) "t1xt" } }
说明t1xt被找到了,所以t2xt 也是一样的。
可以逐渐体现正则表达式的强大
正则表达式函数:
preg_match() | 进行正则表达式匹配
preg_match_all() | 进行全局正则表达式匹配
preg_replace() | 执行正则表达式的搜索和替换
preg_split() | 用正则表达式分割字符串
preg_grep() | 返回与模式匹配的数组单元
preg_replace_callback | 用回调函数执行正则表达式的搜索和替换