/*******************正则匹配preg_match_all*******************************/
说明:匹配百度网页中的超链接,并将超链接过滤掉,只剩下文字,特别说明其中的$bb[3]代表第三个括号内的值
$aa=file_get_contents(“http://www.baidu.com“);
preg_match_all(‘|\<a(.*)([^>]*)\>(.*)\<\/a\>|iU’,$aa,$bb);
print_r($bb[3]);
结果:
Array ( [0] => 搜索设置 [1] => 登录 [2] => 注册 [3] => 新 闻 [4] => 贴 吧 [5] => 知 道 [6] => MP3 [7] => 图 片 [8] => 视 频 [9] => 地 图 [10] => 手写 [11] => 拼音 [12] => 关闭 [13] => 百科 [14] => 文库 [15] => hao123 [16] => 更多>> [17] => 把百度设为主页 [18] => 把百度设为主页 [19] => 把百度添加到桌面 [20] => 加入百度推广 [21] => 搜索风云榜 [22] => 关于百度 [23] => About Baidu [24] => 使用百度前必读 [25] => 京ICP证030173号 )
/*********************批量高级替换preg_replace*******************************************/
说明:替换百度中的超链接,并将第三个括号里的值替换成$3_html,第三个括号中的值_3.html
$aa=file_get_contents(“http://www.baidu.com/“);
$hhh=preg_replace(‘|\<a(.*)([^>]*)\>(.*)\<\/a\>|iU’,’$3_html’,$aa);
echo $hhh;
/*******************************批量高级替换preg_split*************************************/
说明:替换分割成字符数组
$aa=”<dede>aaaa</dede>,dadadsfasdf.<dede>bbbbb</dede>”;
$cc=preg_split(“/[,.]/”,$aa);
/**********************正则匹配位置指定****************************************/
说明:匹配指定
$aa=”<dede>aaaa</dede>dadadsfasdf<dede>bbbbb</dede>”;
preg_match_all(‘|(?<=<dede>)(.*)(?=<\/dede>)|U’,$aa,$cc);
print_r($cc[1]);
.PHP正则表达式-位置指定
接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们用于指定一个位置,就像\b,^,$那样,因此它们也被称为零宽断言。最好还是拿例子来说明吧:
(?=exp)也叫零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如果在查找I’m singing while you’re dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})*\b。请仔细分析这个表达式,它可能不像你第一眼看出来的那么简单。
下面这个例子同时使用了前缀和后缀:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
$aaa=”i am ring going row=3″;
preg_match_all(‘|\b\w+(?=ing\b)|iU’,$aaa,$bb);
preg_match_all(‘|(?<=\brow=)\w+\b|iU’,$aaa,$bb);
(?<= # 查找前缀,但不包含它
<(\w+)> # 查找尖括号括起来的字母或数字(标签)
) # 前缀结束
.* # 匹配任意文本
(?= # 查找后缀,但不包含它
<\/\1> # 查找尖括号括起来的内容:前面是一个”/”,后面是先前捕获的标签
) # 后缀结束
(?<=start).*?(?=end)
/**********************正则匹配相关基础知识***************************************/
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;
}