php正则表达式学习(附各种案例)

正则表达式是用来描述字符排列模式的一种语法规则

作用:用来进行字符串的模式分割,匹配,查找,替换

边界符:一般采用”/”来做它的边界符

原子:

原子包含普通字符,如英文字符,数字,例如a-z,A-Z,0-9

特殊字符:()?^$\.+|   这些需要用”\”转义
“\”是转义字符,如果你的原子里有(*.+\^),请使用\进行转义,如果你要匹配\,请使用\\,同理也可以用\+来表示加号

“\”也有一些特殊功能,比如它加上一些字表,就会表式某种意义,如下:
\d 匹配一个数字0-9  相当于[0-9]
\D 匹配除数字以外的任何一个字符 相当于[^0-9]
\w 匹配一个纯字母,数字及下划线_  相当于[0-9a-zA-Z_]
\W 匹配除了(纯字母,数字及下划线_)以外的   相当于[^0-9a-zA-Z_]
\s 匹配一个空白字符(比如空格,\f换页字符 \n换行字符  \r回车字符 \t制表符 \v垂直字表符) 相当于[\f\n\r\t\v]
\S 匹配除空白字符以外的其它字符 相当于[^\f\n\r\t\v]

[0-9] 匹配任何一个数字,相当于\d
[a-z]匹配任何一个小写字母
[ab]匹配字母a,或者字母b
[A-Z]匹配大写字母
[^a]这里面的^表示取反,在这里匹配除字母a以外的任何字符
[0-9a-zA-Z]匹配任何数字及字母
[^0-9]匹配除数字外的任何其它字符

一个正则表达式,至少包含一个原子
元字符:(有特殊功能用途的字符)*+?.|$

*   0次或者一次,或者多次匹配其前的原子
+   一次或者多次匹配其前的原子,至少一次
?   0次或一次匹配其前的原子
.   匹配除换行符外任何一个字符 linux下相当于[^\n] windows下相当于[^\n\r]
.*  比如/a.*b/这个正则,表示匹配套a和b之间不能有换行的任意多个字符
|   或操作符,匹配二个或多个选择,它的优先级是正则里最低的
/one|two|three/  匹配one,或者two,或者three这样的三个词
^   匹配字符串串首的原子 /^abc/这个表示匹配以abc开头的字符串
$   匹配字符串串尾 /abc$/匹配以abc结尾的字符串
\b  匹配单词的边界 如/\bis\b/ 匹配this is sheep这样里的is,因为这里的is二边都有边界
\B  匹配非单词的边界
{m} 表示其前的原子恰好出现m次
{m,n} 表示其前的原子至少出现m次,至多出现n次
{m,}表示其前的原子出现不少于m次
{,n}表示其前的原子至多不能超过n次
() 整体表示一个原子 比如(abc)这样,abc代表一个原子
比如/(dog)+/匹配字符串dogdogdog,因为dog整体代表一个原子
正则表达式的执行顺序是从左到右执行的
元字符的优先级
优先级一:()
优先级二: 重复配配 ?*+{}
优先级三:边界限制^$\b\B
优先级四:模式选择符 |
模式修正字符:(i,U,s,x)

模式修正符一般标记在整个模式之外,如/abc/i,这里的i就是模式修正符

i   如果设置此修正符,同时匹配模式里的大写和小写 如/abc/i 匹配了aBc
m   表示匹配多行,字符串里只要有一行能匹配上就算成功
如 /^abc/m 匹配多行里以abc开头的,如可以匹配字符串
babcfdfd\nabcfdfd
这里\n表示换行,后面有个abc开头的,因为有了m修正符,所以能配匹上

s   与m相反,表示将字符串视为单行,换行符\n作为普通字符
比如/pr.y/s 可以匹配pr\ny这个字符,虽然.不能匹配换行符,但加上s把\n变成了普通字符
x   忽略模式里的空白不计,比如/i love you/x 其实相当于是/iloveyou/
A   强制从目标字符串开头开始匹配,   /abc/A 相当于/^abc/
D   /abc$/D 表示匹配以abc结尾,后面仍可以有换行,D表示忽略最后的换行
U   匹配最近的一个符符串

例:字符串  “<b>hello</b>abcdefg<hr>aaaaa”
模式: /<.+>/  与之匹配,匹配出来的字符串会是<b>hello</b>abcdefg<hr> 因为它没有选择最近的>
模式: /<.+>/U 与之区配,匹配出来的字符串是<b>,加了U表示匹配最近的能匹配成功的字符串

 

php中的正则替换函数

preg_replace

例:

$str=”thi6s i3s a de9mo”;
echo preg_replace(“/\d/”,”MM”,$str);
上例会将$str里的数字内容替替换成MM

$urlstr=” this is http://www.baidu.com,不是http://www.163.com“;
echo preg_replace(“/(http:\/\/www\.\w+\.com)/iU”,”<a href=\\1>\\1</a>”,$urlstr);
上例会将字符串自动加上链接
()里的内容,会存进\\1,如果()出现多次,会以次存为\\1,\\2,\\3,所以会将匹配上的内容通过\\1进行替换

 

$str=" 名字:{name}<br>email:{email}<br>age:{age}";
$patterns=array("/{name}/","/{email}/","/{age}/");
$replacements=array("张三","zhangsan@gmail.com","27");
echo preg_replace($patterns,$replacements,$str);

上例将会遍历数组依次正则替换,输出内容为:
名字:张三<br>email:zhangsan@gmail.com<br>age:27
preg_split
使用正则表达式来分隔字符串,返回一个数组

举例:
比如要计算一篇文章里有多少句话

$str="一大段的文章内容";
$arr=preg_split("/[,。!、]/",$str);
echo count($arr);

 

正则表达式的实例应用:

ubb代码的转换安例:

$str="[b]abcd[/b][u]abc[/u][code]xxxx[/code]

[align=left]abc[/align][url=http://www.baidu.com]百度[/url]";
echo conubb($str);
function conubb($str){
$pattern=array(
 "/\[b\](.*)\[\/b\]/is",
 "/\[i\](.*)\[\/i\]/is",
 "/\[u\](.*)\[\/u\]/is",
 "/\[font=([,\w\x7f-\xff]*)\](.*)\[\/font\]/is"
 );
//\x7f-\xff 表示任意一个中文字符
$replacement=array(
 "<b>\\1</b>",
 "<i>\\1</i>",
 "<u>\\1</u>",
 "<font face='\\1'>\\2</font>
 );

$str=preg_replace($pattern,$replacement,$str);
return $str;

}

posted on 2012-02-17 14:58  E猫  阅读(1169)  评论(0编辑  收藏  举报

导航