正则表达式基础
1. ‘^’和 $’ 表示用来匹配字符串的开始和结束。(^有两种用法,下一种,见下面)
- “^mtg”: 匹配以 “mtg”开头的字符串;
- “mtg$”: 匹配以 “mtg” 结尾的字符串;
- “^mtg$”: 匹配以mtg开头和以mtg结尾的字符串,实际上是只有abc与之匹配
2. ‘*’表示0次或者多次,‘+’表示1次或多次,‘?’表示0次或1次
- “ab*”: 匹配字符串a和0个或者多个b组成的字符串
- “ab*”: 匹配字符串a和1个或者多个b组成的字符串
- “ab?”: 匹配字符串a和0个或者1个b组成的字符串
3. 大括号里面控制字符出现的个数
- “ab{2}”: 匹配一个a后面只跟两个b;
- “a(bc){2,}”: 匹配一个a至少跟两个bc;
- “ab{3,5}”: 匹配一个a跟3到5个b”.
4.字符 ‘│’, 相当于OR 操作
- “(a│bc)de”: 匹配含有 “ade” 或者 “bcde”的字符串;
5.一个点’.’可以代表除换行符之外的任意单个字符,中括号括住的内容只匹配一个单一的字符
- “a.[0-9]”: 匹配一个a跟一个字符再跟一个数字
如果需要匹配包含换行符在内的任意字符
"([\s\S]*)" 或"([\d\D]*)" 或"([\w\W]*)" 来表示。
6.[^x]:匹配除了 x 意外的任意字符
- “[^x]*”: 表示匹配除x外的任意字符
7.常用的元字符
- “\w”: 匹配字母或数字或下划线
- “\W”: \w的反义,即匹配任意非字母,数字,下划线和汉字的字符
- “\d”: 匹配数字
- “\D”: \d的反义,即匹配任意非数字的字符
- “\s”: 匹配任意的空白符
- “\S”: \s的反义,即匹配任意非空白符的字符
- “\b”: 匹配单词的开始或结束
- “\B”: \b的反义,即不是单词开头或结束的位置
下面的代码是对\b的用法的实例,preg_match_all()函数下面将介绍:
$str="hi history";
preg_match_all("/\bhi\b/",$str,$arr);
preg_match_all("/hi/",$str,$arr1);
var_dump($arr);
var_dump($arr1);
输出为:
array(1) {
[0]=>
array(1) {
[0]=>
string(2) "hi"
}
}
array(1) {
[0]=>
array(2) {
[0]=>
string(2) "hi"
[1]=>
string(2) "hi"
}
}
即”\b”只匹配单个的单词
8.正则表达式中需要转义的特殊字符:
* . ? + $ ^ [ ] ( ) { } | \ / " "
如[,如果需要转义使用 \[
;
下面的代码是关于\[
的使用代码:
$str="[123]";
preg_match_all("/\[([^\]]*)\]/",$str,$arr);//更简单的正则式为
"/\[(.*)\[/"
var_dump($arr);
输出为
array(2) {
[0]=>
array(1) {
[0]=>
string(5) "[123]"
}
[1]=>
array(1) {
[0]=>
string(3) "123"
}
}
9.preg_match()函数:
函数原型:
int preg_match( string pattern, string subject [, array matches ] )
成功返回 1 ,否则返回 0 。
参数:
- pattern 正则表达式
- subject 需要匹配检索的对象
- matches 可选,存储匹配结果的数组, matches[0]将包含与整个模式匹配的文本,matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推
提示:preg_match() 第一次匹配成功后就会停止匹配,如果要实现全部结果的匹配,即搜索到subject结尾处,则需使用 preg_match_all() 函数。
例如:
$str=" aabab ";
preg_match("/a.*?b/",$str,$arr);
var_dump($arr);
输出为
array(1) {
[0]=>
string(3) "aab"
}
10.preg_match_all()函数:
函数原型:
int preg_match_all( string pattern, string subject, array matches [, int flags ] )
成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。
参数:
- pattern 正则表达式
- subject 需要匹配检索的对象
- matches 存储匹配结果的数组
- flags
可选,指定匹配结果放入 matches 中的顺序,可供选择的标记有:
- PREG_PATTERN_ORDER:默认,对结果排序使 matches[0]为全部模式匹配的数组,matches[1] 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推
- PREG_SET_ORDER:对结果排序使 matches[0]为第一组匹配项的数组,matches[1] 为第二组匹配项的数组,以此类推
- PREG_OFFSET_CAPTURE:如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量
$str=" <p>abcde</p> <p>fghij</p> ";
preg_match_all("/<p>(.*?)<\/p>/",$str,$arr);
var_dump($arr);
array(2) {
[0]=>
array(2) {
[0]=>
string(12) "<p>abcde</p>"
[1]=>
string(12) "<p>fghij</p>"
}
[1]=>
array(2) {
[0]=>
string(5) "abcde"
[1]=>
string(5) "fghij"
}
}
11.模式修正符的使用
12.贪婪模式(尽可能的匹配更多内容)和非贪婪模式(尽可能的匹配更少的内容)
如字符串aabab:
- 贪婪模式:pattern为”/a.*b/”匹配的结果为aabab。
- 非贪婪模式: pattern为”/a.*?b/”匹配的结果为aab和ab
13.向后引用
定义:当用“()”定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。当对被匹配的组进行向后引用的时候,可以用“\数字”的方式进行引用。”\1“引用第一个匹配的后向引用组,”\2”引用第二个组,以此类推,”\n”引用第n个组。而”\0”则引用整个被匹配的正则表达式本身。我们看一个例子。
假设你想匹配一个HTML标签的开始标签和结束标签,以及标签中间的文本。例如
<B>This is a test</B>
则pattern为
<(.*)>.*<\/\1>
14.常用正则表达式
- E-mail地址:
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
- 2.URL:
^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
- 邮政编码:
^[1-9]\d{5}$
- 手机号码:
^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$
- 匹配HTML标记:
<(.*)>.*<\/\1>|<(.*) \/>
- 提取信息中的图片链接:
(s|S)(r|R)(c|C) *= *('|")?(\w|\|\/|\.)+('|"| *|>)?
- 提取信息中的中国手机号码:
(86)*0*13\d{9}
- 提取信息中的中国固定电话号码:
(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
- 腾讯QQ号:
`^[1-9]*[1-9][0-9]*$
- 千里码的一道题:写一个正则表达式来匹配这些符合要求的身份证号(出生年份在1985-1995的男性用户):
^[\d]{6}19(8[5-9]|9[0-5])[\d]{6}[013579][0-9xX]$