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; }