一、正则表达式简介 正则表达式通过构建具有特定规则的模式,与输入字符串信息比较,在特定函数中使用从而实现字符串的匹配、查找、替换及分割等操作。 php中支持两套正则表达式的处理库函数。一套是由PCRE(Perl Compatible Regular Expression),使用preg_为前缀命名的函数。另一套由POSIX(Portable Operation System interface)扩展语法的正则表达式函数,使用ereg_为前缀命名的函数。 一般而言使用PCRE提供的正则表达式效率略占优势。
二、正则表达式的组成: 定界符 原子 元字符 模式修正符 1、定界符: 通常用"/",除字母、数字、反斜线""之外任何字符 2、原子: (1)普通字符作为原子 '/php/' (2)一些特殊字符和元字符作为原子 " , ' , * ,+ ,. (3)非打印字符作为原子 (4)“通用字符类型”字符作为原子 \d 任意一个 十进制数字 \D \w 任意一个数字、字母或下划线 \W \s 任意一个空白字符 \S
(5)自定义原子表作为原子[]
[abc] [a-z]
3、元字符 (1)限定符: * ,+ ,? {m,n} (2)边界限制:
^ ,
$ ,
\b 单词边界
\B 非单词边界
(3)句号或圆点符号 “ . ”
匹配目标中任何一个字符(但默认不匹配换行符)。
(4) 模式选择符 |
用来分割多选一模式 。
(5)模式单元 ()
使用元字符()将多个原子组成大的原子,当成一个单元独立使用。
(6)后向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到临时缓冲区中,可被获取供以后使用。缓冲区编号从1开始最大到99
非捕获元字符 “?:” , “ ?=”, “ ?!”
4、模式修正符(7个,重点3个) i 忽略大小写 m 将字符串视为多行 s 圆点元字符“.”匹配所有字符,包括换行符 ......
三、正则表达式的函数 1、preg_match() 执行正则表达式匹配,第一次匹配之后就停止搜索 preg_match(string pattern,string subject,[,array matches])
2、preg_match_all() 执行全局正则表达式匹配,一直搜索到指定字符串的结尾
preg_match_all(string pattern,string subject,array matches,[,int flags])
flags两个预定义值:
PREG_PATTERN_ORDER matches[0]为全部模式匹配的数组, matches[1]为第一个括号中的子模式所匹配的字符串组成的数组
PREG_SET_ORDER matches[0]为第一组匹配项的数组,matches[1]为第二组匹配项的数组
3、 preg_grep() 返回与模式匹配的数组单元
preg_grep(array pattern,array input) 匹配数组中的元素,返回与正则表达式匹配的数组元素
4、 preg_replace() 执行正则表达式的搜索和替换
preg_replace(mixed pattern,mixed replacement, mixed subject, [,int limit]) 如果指定了limit,则仅替换limit个匹配
5、 preg_replace_callback() 用回调函数执行正则表达式的搜索和替换
6、preg_split() 用正则表达式分割字符串
array preg_split(string pattern,string subject [,int limit[,int flags]])
flags可以是下列标记的任意组合:
PREG_SPLIT_NO_EMPTY 只返回非空的成分
PREG_SPLIT_DELIM_CAPTURE 定界符模式中的括号表达式也会被捕获并返回--不太理解
PREG_SPLIT_OFFSET_CAPTURE 同时返回匹配串的偏移量
附:最常用的正则实践
<?php echo "<h3>正则练习</h3>"; /* //匹配手机号 //1开头的11位数字 $partten = '/1\d{10}/'; $str = "13436580530"; */ /* //匹配email地址 //1、字母、数字、下划线开头 2、@ 符号 3、@ 后主域名部分-qq 4、域名后内容,以点开头的各部分.com.cn //$partten = '/^[0-9a-zA-Z_]+@[0-9a-zA-Z_]+(\.[0-9a-zA-Z_]+){1,3}$/'; //$partten = '/^\w+@\w+(\.\w+){1,3}$/'; //$partten = '/^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_-]+){1,3}$/'; $partten = '/^[\w-]+@[\w-]+(\.[\w-]+){1,3}$/'; $str = "17276672@qq.com"; */ /* //匹配url地址 参考: URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$ 或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$ 或:^[a-zA-Z]+://[^\s]*$ $partten = '/^http:\/\/\w+(\.\w+){1,3}/';//不太精确 $str = "http://www.qq.com/news.php?id=1"; */ /* //匹配html标签 参考:<(.*)>.*<\/\1>|<(.*) \/> */ $partten = '/^<(\S*?)[^>]*>.*?<\/\1>|<.*?\/>$/'; //$str = "<p>html标签</p>"; $str = "<br/>"; if(preg_match($partten,$str)){ echo "匹配成功!"; }else{ echo "匹配失败!"; }