1.基本格式
正则表达式的形式一般如下:
“/abc/” 或者 “#abc#”
2.正则函数
php中有两套正则函数
一套是由PCRE库提供的,使用“preg_”为前缀命名的函数
一套是由POSIX扩展提供的,使用以“ereg_”为前缀命名的函数(将退出历史舞台)
通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/apple/”。
使用PERL兼容规则的函数有:
preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()
函数的具体使用,我们可以通过PHP手册来找到。
3.元字符
较为常用的元字符包括:“+”, “*”,以及“?”。
* 其前导字符必须在目标对象中出现0次、1次或连续多次;
. 用于匹配除换行符之外的所有字符1次;
? 其前导匹配对象连续出现0次或1次;
+ 其前导匹配对象连续出现1次或多次;
| 选择匹配类似PHP中的| (因为这个运算符合是弱类型导致前面最为整体匹配);
^ 匹配对象出现在字符串的首部;
$ 匹配对象出现在字符串尾部
{m} 匹配前一个内容的重复次数为M次;
{m,} 匹配前一个内容的重复次数大于等于M次;
{m,n} 匹配前一个内容的重复次数M次到N次;
( ) 合并整体匹配,并放入内存,可使用\1 \2…依次获取;
\b 出现在目标字符串的开头或结尾的两个边界之一,边界可以是空格或者特殊字符;
\B 对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾;
\s: 用于匹配单个空格符,包括tab键和换行符,等价于[\f\t\v];
\S: 用于匹配除单个空格符之外的任何一个字符,[^\f\t\v];
\d: 匹配从0到9的一个数字,等价于[0-9];
\D 匹配除数字以外任何一个字符,等价于[^0-9];
\w: 用于匹配一个字母、数字或下划线字符,等价于[0-9a-zA-Z_];
\W: 用于匹配所有除英文字母、数字和下划线以外任何的一个字符,[^0-9a-zA-Z_];
\A 匹配字符串串首的原子
\Z 匹配字符串串尾的原子
\f 匹配一个换页符等价于 \x0c 或 \cL
\t 匹配一个制表符;等价于 \x09\或\cl
\v 匹配一个垂直制表符;等价于\x0b或\ck
\oNN 匹配一个八进制数字
\xNN 匹配一个十六进制数字
\cC 匹配一个控制字符
4.运算顺序
运算规则:从左→到右
优先级:
()( ) 圆括号因为是内存处理所以最高;
* ? + { } 重复匹配内容其次;
^ $ \b 边界处理第三;
| 条件处理第四;
最后按照运算顺序计算匹配。
5.运用实例
“^abc”:开头一定要有”abc”字符串;
“of me$”:结尾一定要有”of me” 的字符串;
“^abc$”:就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配;
“abc”:匹配包含abc的字符串;
’*’ ‘+’ 和 ‘?’ 只管它前面那个字符
“ab*”: 和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串(”a”, “ab”, “abbb”, 等);
“ab+”: 和ab{1,}同义,同上条一样,但最少要有一个b存在 (”ab” “abbb”等);
“ab?”: 和ab{0,1}同义,可以没有或者只有一个b;
“a?b+$”:匹配以一个或者0个a再加上一个以上的b结尾的字符串。
“ab{3,5}”: 要求a后面可以有2-5个b(”abbb”, “abbbb”, or “abbbbb”)。
“a(bc)*”: 匹配 a 后面跟0个或者一个”bc
“hi|hello”: 匹配含有”hi” 或者 “hello” 的字符串
“a.[0-9]”: 一个a加一个字符再加一个0到9的数字;
“^.{3}$”: 三个任意字符结尾。
中括号括住的内容只匹配一个单一的字符
“[ab]”: 匹配单个的 a 或者 b ( 和 “a│b” 一样);
“^[a-zA-Z]”: 匹配以大小写字母开头的字符串;
“[0-9]%”: 匹配含有形如 x% 的字符串;
“,[a-zA-Z0-9]$”: 匹配以逗号再加一个数字或字母结尾的字符串;
6.验证邮箱
构造检查email的正则表达式
在一个完整的email地址中有三个部分:
1. 用户名 (在‘@’左边的一切)
2.’@’
3. 服务器名(就是剩下那部分)
用户名可以含有大小写字母阿拉伯数字,句号(’.’)减号(’-’)and下划线’_’),服务器名字也是符合这个规则,当然下划线除外。
现在,用户名的开始和结束都不能是句点,服务器也是这样,还有你不能有两个连续的句点他们之间至少存在一个字符。
好现在我们来看一下怎么为用户名写一个匹配模式:
^[_a-zA-Z0-9-]+$
现在还不能允许句号的存在,我们把它加上:
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$
上面的意思就是说:以至少一个规范字符(除了.)开头,后面跟着0个或者多个以点开始的字符串。
简单化一点, 我们可以用eregi()取代ereg(),eregi()对大小写不敏感, 我们就不需要指定两个范围“a-z”和“A-Z”只需要指定一个就可以了:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*$
后面的服务器名字也是一样,但要去掉下划线:
^[a-z0-9-]+(\.[a-z0-9-]+)*$
好,现在只需要用”@”把两部分连接:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$
这就是完整的email认证匹配模式了,只需要调用:
eregi(”^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$”,$eamil)
就可以得到是否为email了