<?php
正则表单php中有2套正则函数 .1: PCRE库 2 : POSIX库 提供的函数(POSIX库被弃用)
在php中 一个正则分成三个部分 分隔符、表达式、修饰符
分隔符 / # % ! ~ 一般用/
修饰符:用于开启或关闭某种功能或模式
正则表单中的元字符
her he heet
\bhe\b //匹配 he
//"\b" 代表单词的开头或结尾,也就是单词的分界处
一、元字符
. //匹配除了换行符以外的任意字符
\w // 匹配字母或数字或下划线或汉字
\s //匹配任意空白符
\d //匹配数字
\b //匹配单词的开始或者结束
^ //匹配字符串的开始
$ //匹配字符串的结束
- //表示范围 1-9
[] //匹配括号中的任意一个字符
* + ? //量词
下面看一些列子
(1).匹配以字母a开始的单词
\ba\w*\b
(2) 匹配1个或更多的数字
\d+
(3) 匹配6个字符的单词
\b\w{6}\b //匹配 action 123456 ste_ph等
注意 正则表达式里"单词"指不少于1个的连续字母和数字
二、量词
* //重复0 或者更多次
+ //重复1次或者更多次
? //重复0次或者1次
{n} //重复n次
{n,} //重复n次或者更多次
{n,m}//重复n到m次
三、字符组 字符组里面的元字符不用转义 就是代表该符号
[aeiou] //匹配任何一个英文元音字母
[.?!] //匹配标点符号(. ? !)其中一个标点符号
c[aou]t //匹配 cat cot cut 这3个单词 而caout 则不匹配
四、转义
一般用 反斜杠 \ 转义 ,还有一种是 用 \Q和\E扩起来里面的内容就是本身
baidu\.com 匹配 baidu.com
c:\\windows 匹配 c:\windows
\d+\Q.$.\E$ //匹配一个或者多个数字,紧接着是一个点号,然后是一个$ ,再然后是一个点号 ,最后是字符串的尾部,\Q和\E之间的元字符都会作为普通字符用来匹配
五、反义
\W 匹配任意不是字母、数字、下划线、汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] //匹配除了x 以外的任意字符
[^aeiou] //匹配除了aeiou这几个字母以外的任意字符
列子
1.不包含空白符的字符串
\S+
2.用尖括号扩起来、已a开头的字符串
<a[^>]+>
匹配 <a href="http://www.baidu.com" >
六、分支
要匹配
cat,hat,fat,toat
(c|h|f|to)at // | 表示分支, ()表示一个整体 也叫分组 后面提到
[ch]at = (c|h)at
思考以下案例
0\d{2}-\d{8} | 0\d{3}-\d{7}
这个表单 式 能匹配2种连字号的电话号码 一种是3位区号8位本地号(如010-12345678)
一种是4位区号7位本地号(如0376-2233445)
七、分组
常用分组语法
捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里, 也可以写成 (?'name'exp)
(?:exp) 匹配exp 不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) //匹配exp前面的位置
(?<=exp) //匹配exp后面的位置
(?!exp) //匹配后面跟的不是exp的位置
(?<!exp) //匹配前面不是exp的位置
注释
(?#comment) //提供注释辅助阅读,不对正则表达式的处理产生任何影响
简单的ip地址匹配
(\d{1,3}\.){3}\d{1,3}
上面会匹配 256.300.800.900 显然不对
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
默认情况下,每个分组都有拥有一个组号,规则,从左向右,以分组的左括号为标志,第一个出现的分组组号为1,第二为2,分组0 对应整个正则表达式
也可以指定子表单式的组名,语法如下:
?<Word>\w+
或
?'Word'\w+
这样就把\w+组名指定为Word
八、反向引用
\b(\w+)\b\s+\1\b
以上表达式可以匹配重复的单词 如go go 或者 kitty kitty
要反向引用分组捕获的内容 可以使用 "\k<Word>" 所以上面也可以写成这样
\b(?<Word>\w+)\b\s+\k<Word>\b
列子:UBB标签[url]1.gif[/url]用于插入表情的,在解析时需要把1.gif换成对应的路径,并且需要用html的img标签替换,方法如下所示
环视
1.顺序肯定环视(?=exp)
\b\w+(?=ing\b)
以上表达式查找一下句子时,会匹配 sing 和danc
i am singing while you are dancing
2.逆序肯定环视(?<=exp)
(?<=\bre)\w+\b
reading a book // 匹配 ading
\b\w*q[^u]\w*\b //以上表达式匹配的是含字母q但后面不是u的单词
但是出现Iraq ,Benq q在最后面的时候,他就会出错 因为[^u] //必须匹配一个
可以这么解决
\b\w*q(?!u)\w*\b
3.
顺序否定环视
c(?![au]t\b)\w+t //匹配 chart等 不匹配 cat cut
4.
逆序否定环视
(?<![a-z])\d{7} //前面不是小写字母的7位数字
贪婪/懒惰匹配
默认贪婪匹配 尽可能的匹配多的
a.*b // aabab 就是贪婪匹配
a.*?b //匹配a开始以b结束的 短字符串
懒惰限定符合
*? //重复任意次,但尽可能少重复
+? //重复1次或等多次, 但尽可能少重复
?? //重复0次或1次 ,但尽可能少重复
{n,m}? //重复n到m次 ,但尽可能少重复
{n,}? //重复n次以上,但尽可能少重复
<div>logo</div>
(?<=<div>).*(?=</div>) //匹配除logo
m|food 和(m|f)ood的区别 考虑 优先级
m 或者food
mood 或者food
正则的常用模式
i 忽略大小写模式
m 多行模式
s 点号通配模式
U 懒惰模式
#\[url\](.*)\[\/url\]#U
和
#\[url\](.*?)\[\/url\]# //等价的
D 结尾限制
"abc\n"
%abc$% //匹配的
%abc$%D //不匹配
正则在实际开发中的应用
<?php
$mobile="13500000000";
$regex="!^(13[4-9]|15[0189]|188)\d{8}$!";
if(!preg_match()){
die('错误');
}else{
die('yes');
}
匹配E-email地址
^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$
apache 重写
正则表达式的效率与优化
(a|b|c|d|e|f|g)
[abcdefg]
[a-g]
//第一种最慢不要用. 二三差不多
标准量词是匹配优先级的
copy2003y
\w*(\d+) \d匹配3 //\w*为匹配全部,然后慢慢一个一个吐出来, \d得到3结束
\w*?(\d+) \d匹配2003
慎用点员字符
合理使用字符串函数代替
合适使用括号 每次使用一次括号,而不是非捕获型括号(?:....)就会保留一部分内存等着再次访问
起始、行描点优化
^(?:abc|123) 比 ^123|^abc 效率高
^(abc) 比(^abc)效率高
使用正则以外的解决方案
php5 提供 filter函数
filter_var('admin@example.com'FILTER_VALIDATE_EMAIL);
JAVASCRIPT 里面 用DOM代替一些正则匹配
php的字符串函数
php的 tokenizer 系类函数
php的url 函数及一些http函数
php的filter 系列函数
javascript的dom 模型
正则表单php中有2套正则函数 .1: PCRE库 2 : POSIX库 提供的函数(POSIX库被弃用)
在php中 一个正则分成三个部分 分隔符、表达式、修饰符
分隔符 / # % ! ~ 一般用/
修饰符:用于开启或关闭某种功能或模式
学习测试工具:火狐扩展 Regular Expression Tester 进行测试
正则表单中的元字符
her he heet
\bhe\b //匹配 he
//"\b" 代表单词的开头或结尾,也就是单词的分界处
一、元字符
. //匹配除了换行符以外的任意字符
\w // 匹配字母或数字或下划线或汉字
\s //匹配任意空白符
\d //匹配数字
\b //匹配单词的开始或者结束
^ //匹配字符串的开始
$ //匹配字符串的结束
- //表示范围 1-9
[] //匹配括号中的任意一个字符
* + ? //量词
下面看一些列子
(1).匹配以字母a开始的单词
\ba\w*\b
(2) 匹配1个或更多的数字
\d+
(3) 匹配6个字符的单词
\b\w{6}\b //匹配 action 123456 ste_ph等
注意 正则表达式里"单词"指不少于1个的连续字母和数字
二、量词
* //重复0 或者更多次
+ //重复1次或者更多次
? //重复0次或者1次
{n} //重复n次
{n,} //重复n次或者更多次
{n,m}//重复n到m次
三、字符组 字符组里面的元字符不用转义 就是代表该符号
[aeiou] //匹配任何一个英文元音字母
[.?!] //匹配标点符号(. ? !)其中一个标点符号
c[aou]t //匹配 cat cot cut 这3个单词 而caout 则不匹配
四、转义
一般用 反斜杠 \ 转义 ,还有一种是 用 \Q和\E扩起来里面的内容就是本身
baidu\.com 匹配 baidu.com
c:\\windows 匹配 c:\windows
\d+\Q.$.\E$ //匹配一个或者多个数字,紧接着是一个点号,然后是一个$ ,再然后是一个点号 ,最后是字符串的尾部,\Q和\E之间的元字符都会作为普通字符用来匹配
五、反义
\W 匹配任意不是字母、数字、下划线、汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] //匹配除了x 以外的任意字符
[^aeiou] //匹配除了aeiou这几个字母以外的任意字符
列子
1.不包含空白符的字符串
\S+
2.用尖括号扩起来、已a开头的字符串
<a[^>]+>
匹配 <a href="http://www.baidu.com" >
六、分支
要匹配
cat,hat,fat,toat
(c|h|f|to)at // | 表示分支, ()表示一个整体 也叫分组 后面提到
[ch]at = (c|h)at
思考以下案例
0\d{2}-\d{8} | 0\d{3}-\d{7}
这个表单 式 能匹配2种连字号的电话号码 一种是3位区号8位本地号(如010-12345678)
一种是4位区号7位本地号(如0376-2233445)
七、分组
常用分组语法
捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里, 也可以写成 (?'name'exp)
(?:exp) 匹配exp 不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) //匹配exp前面的位置
(?<=exp) //匹配exp后面的位置
(?!exp) //匹配后面跟的不是exp的位置
(?<!exp) //匹配前面不是exp的位置
注释
(?#comment) //提供注释辅助阅读,不对正则表达式的处理产生任何影响
简单的ip地址匹配
(\d{1,3}\.){3}\d{1,3}
上面会匹配 256.300.800.900 显然不对
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
默认情况下,每个分组都有拥有一个组号,规则,从左向右,以分组的左括号为标志,第一个出现的分组组号为1,第二为2,分组0 对应整个正则表达式
也可以指定子表单式的组名,语法如下:
?<Word>\w+
或
?'Word'\w+
这样就把\w+组名指定为Word
八、反向引用
\b(\w+)\b\s+\1\b
以上表达式可以匹配重复的单词 如go go 或者 kitty kitty
要反向引用分组捕获的内容 可以使用 "\k<Word>" 所以上面也可以写成这样
\b(?<Word>\w+)\b\s+\k<Word>\b
列子:UBB标签[url]1.gif[/url]用于插入表情的,在解析时需要把1.gif换成对应的路径,并且需要用html的img标签替换,方法如下所示
环视
1.顺序肯定环视(?=exp)
\b\w+(?=ing\b)
以上表达式查找一下句子时,会匹配 sing 和danc
i am singing while you are dancing
2.逆序肯定环视(?<=exp)
(?<=\bre)\w+\b
reading a book // 匹配 ading
\b\w*q[^u]\w*\b //以上表达式匹配的是含字母q但后面不是u的单词
但是出现Iraq ,Benq q在最后面的时候,他就会出错 因为[^u] //必须匹配一个
可以这么解决
\b\w*q(?!u)\w*\b
3.
顺序否定环视
c(?![au]t\b)\w+t //匹配 chart等 不匹配 cat cut
4.
逆序否定环视
(?<![a-z])\d{7} //前面不是小写字母的7位数字
贪婪/懒惰匹配
默认贪婪匹配 尽可能的匹配多的
a.*b // aabab 就是贪婪匹配
a.*?b //匹配a开始以b结束的 短字符串
懒惰限定符合
*? //重复任意次,但尽可能少重复
+? //重复1次或等多次, 但尽可能少重复
?? //重复0次或1次 ,但尽可能少重复
{n,m}? //重复n到m次 ,但尽可能少重复
{n,}? //重复n次以上,但尽可能少重复
<div>logo</div>
(?<=<div>).*(?=</div>) //匹配除logo
m|food 和(m|f)ood的区别 考虑 优先级
m 或者food
mood 或者food
正则的常用模式
i 忽略大小写模式
m 多行模式
s 点号通配模式
U 懒惰模式
#\[url\](.*)\[\/url\]#U
和
#\[url\](.*?)\[\/url\]# //等价的
D 结尾限制
"abc\n"
%abc$% //匹配的
%abc$%D //不匹配
正则在实际开发中的应用
<?php
$mobile="13500000000";
$regex="!^(13[4-9]|15[0189]|188)\d{8}$!";
if(!preg_match()){
die('错误');
}else{
die('yes');
}
匹配E-email地址
^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$
apache 重写
正则表达式的效率与优化
(a|b|c|d|e|f|g)
[abcdefg]
[a-g]
//第一种最慢不要用. 二三差不多
标准量词是匹配优先级的
copy2003y
\w*(\d+) \d匹配3 //\w*为匹配全部,然后慢慢一个一个吐出来, \d得到3结束
\w*?(\d+) \d匹配2003
慎用点员字符
合理使用字符串函数代替
合适使用括号 每次使用一次括号,而不是非捕获型括号(?:....)就会保留一部分内存等着再次访问
起始、行描点优化
^(?:abc|123) 比 ^123|^abc 效率高
^(abc) 比(^abc)效率高
使用正则以外的解决方案
php5 提供 filter函数
filter_var('admin@example.com'FILTER_VALIDATE_EMAIL);
JAVASCRIPT 里面 用DOM代替一些正则匹配
php的字符串函数
php的 tokenizer 系类函数
php的url 函数及一些http函数
php的filter 系列函数
javascript的dom 模型