2012.4.30
正则表达式学习笔记
一、正则表达式概述
- 正则表达式就是描述字符串排列的模式的一种自定义语法规则。
- 如果可以使用字符串处理函数完成的任务,就不要使用正则表达式处理。字符串处理函数效率较高。正则表达式应用广泛:如提取网站中的新闻内容;对文章的内容搜索,替换;验证用户名,密码格式是否合法;抓取网页中特定格式数据等。
- 有一些复杂的操作,只能使用正则表达式完成。
- 正则表达式也称为一种模式表达式。
- 正则表达式就是构建具有特定规则的模式,与输入的字符信息比较。再进行分割,匹配,查找,替换等工作。
二、一个简单的正则表达式例子:
"/\<img\s*src=\".*?\"\/\>/"
由此可见,正则表达式有以下特点:
- 正则表达式也是一个字符串
- 由具有特殊意义的字符组成的字符串
- 具有一定的编写规则,也是一种模式
- 看作是一种编程语言(是用一些特殊字符按规则编写出一个字符串,形成一种模式---正则表达式)
注意:如果正则表达式,不和函数一起使用,则它就是一个字符串,如果将正则表达式放到某个函数中使用,才能发挥出正则
表达式的作用。
三、正则表达式的处理函数
在PHP中给我们提供了两套正则表达式函数:
- POSIX扩展正则表达式函数,函数以ereg_开头
- Perl兼容正则表达式函数,函数以preg_开头(效率较高)
两者功能一样,后者效率较高,选用。在JAVA,JS也可应用,只是换一下函数名
学习目标:
- 正则表达式的模式如何编写
- 学习正则表达式的强大处理函数
四、正则表达式语法
正则表达式由一下四种符号构成
"/\<img\s*src=\".*?\"\/\>/iU"
/原子和元字符/模式修正符号 //为定界符(有一些语言是不需要这个定界符号)
- 定界符号 / /
除了字母、数字和正斜线\以外的任何字符都可以为定界符,如| |、{ }、! !没特殊需要,我们都使用正斜线作为正则表达式的定界符号
- 原子 img \s
注意:原子是正则表达式的最基本组成单位,而且必须至少要包含一个原子,只要一个正则表达式可以单独使用的字符,就是原子
- 原子包含所有打印(键盘上所欲可以再屏幕上输出的字符)和非打印字符(看不到的,如空格)
- . * + ? { <> 这些有特殊意义的字符,想作为原子使用,使用‘\’转义字符转义
\. \* \+ \? \m,转义字符可以将有意的字符转成没意义的字符,还可以将没意义的字符转为有意义的字符
- 在正则表达式中可以直接使用一些代表范围的原子
- \d :表示任意一个十进制数字; \D:表示任意一个除数字外的字符
- \s:表示任意一个空白字符; \S:表示任意一个除空白字符外其他字符
- \w:表示任意一个字(word)[a-z0-9A-Z] \W:表示任意一个非字,[^a-z0-9A-Z]
- 自己定义一个原子表[],可以匹配方括号的任意原子,[^]表示出了原子表里的其他字符
- 元字符 * ?
元字符是一种特殊的字符,是用来修饰原子用的,不可以单独出现
- * :表示其前的原子可以出现0次、一次或多次(克林闭包)
- + :表示其前的原子可以出现一次或多次(正闭包)
- ? :表示其前的原子可以出现0次或一次
- . : 表示除空格外所有字符,常用法:.*?或.+?:任意多个任意字符
- ^ :直接在正则表达式的第一个字符出现,表示必须以这个正则表达式开始,区别:/^one/和[^one]
- $ :直接在正则表达式的最后一个字符出现,表示必须以这个正则表达式结尾
- | :表示或的关系(它的优先级最低),例:/cat|dog/
- {} :用于自定义前面出现的原子次数{m}、{m,}、{m,n}
- \b:表示一个边界
- \B:表示一个非边界,以上两个可以用于提取is island中的is 和island
- 重点 ():
- ()作为大原子使用,例:/abc+/和/(abc)*/的区别
- 改变优先级,例:/ca(t|d)og/
- 作为子模式使用
- 可以取消子模式,就将()作为大原子或改变优先级使用,只要在其前加?:,即(?:)
- 反向引用,可以在模式中直接将子模式中取出来,再作为正则表达式模式的一部分,如果是在正则表达式像替换函数preg_replace函数中,可以将子模式取出,在被替换的字符串中使用。
\1取第一个子模式、 \2取第二个子模式...(注意是单引号还是双引号引起来的正则时的用法)
"\\1" = '\1'
4. 模式修正符号 i U
"/ /模式修正符"
- 就是几个字母
- 可以一次使用一个,每一个具有一定的意义,也可以连续使用多个
- 是对整个正则表达式调优使用,也可以说是对正则表达式功能的扩展
"/abc/"只能匹配小写字母abc;"/abc/i"可以不区分大小写匹配
有些语言不支持模式修正符号 如javascript
五、正则表达式处理函数
- 模式匹配函数:
preg_match()--匹配一次
preg_match_all()全匹配
字符串匹配函数:strstr()、strpos()可以进行简单地匹配与查找;取子串substr()$pattern="/abc/"; //正则表达式模式 $string="1111111abc111111"; //需要匹配的字符串 if(preg_match($pattern,$string)){ echo "正则表达式<b>{$pattern}</b> 和字符串<b>{$string}</b> 匹配成功"; }else{ echo "正则表达式<b>{$pattern}</b>和字符串<b>{$string}</b> 匹配失败"; }
- 搜索替换函数str_replace()和preg_replace()
- 系统提供的str_replace(),四个参数用法:
- str_replace(string,string,string)字符串替换字符串
- str_replace(array,string,string)将数组中的关键字替换为统一的一个字符串
- str_replace(array,array,string)依次对应替换数组中的元素
- 第四个参数可选,表示被替换的次数
为URL地址加上链接的DEMO:
<?php $str="这是一个网站链接http://www.baidu.com的表达式"; $str.="这是一个网站链接http://www.google.com的表达式"; $str.="这是一个网站链接ftp://www.baidu.org的表达式"; $str.="这是一个网站链接ftps://www.baidu.net的表达式"; echo setUrl($str); function setUrl($str){ $url="/(https?|ftps?):\/\/(www|mail|news)?\.([^\/\.]+)\.(com|org|net)/i"; //找出str中所有URL地址,并存入arr数组 preg_match_all($url,$str,$arr); //为str中所有URL地址加上链接符 $str=str_replace($arr[0],array_map("addlink",$arr[0]),$str); return $str; } function addlink($url){ return '<a href="'.$url.'">'.$url.'</a>'; } ?>
- 正则中替换函数preg_replace()
- 正常使用,将正则匹配到得内容替换
ex:将$str中的字母都删除
$str=preg_replace("[a-zA-z]","",$str);
- 将正则中的子模式,可以用到第二个参数中
ex1:将$str中字母改为红色
$str=preg_replace("/([a-z]+)/i",'<font color="red">\1</font>',$str,11);
ex2:改写1中的setUrl()
function setUrl($str){ $url="/(https?|ftps?):\/\/(www|mail|news)?\.([^\/\.]+)\.(com|org|net)/i"; //为str中所有URL地址加上链接符 $str=preg_replace($url,'<a href="\1://\2.\3.\4">${1}://${2}.${3}.${4}</a>',$str); return $str; }
- 在第二个参数中调用函数
ex:将$str中字母改为红色并改为大写
$str=preg_replace("/([a-z]+)/ei",'"<font color=\"red\">"'.'.strtoupper("\1").'.'"</font>"',$str,11);
注意模式修正符e,可以将第二个参数中使用函数计算- 在前两个参数中都使用数组,即将多个正则模式同时替换成多个值
如论坛发帖的UBB转换为HTML标签
- 正常使用,将正则匹配到得内容替换
- 字符串分割函数explode()和正则分割函数preg_split();
- 按某个特定字符(串)分割使用explode();
- 按一个正则模式分割preg_split();
- 可以用统一函数implode()(别名join())进行字符串组合