您的位置:首页 > 其它

正则表达式学习笔记

2009-11-05 10:52 211 查看
最近在学习正则,一些比较有用的东西怕忘记,记下来,比较乱,想一条记录一条:

1.
//匹配文本,这个偶尔比较好用,但是要小心字符中包含\E

2.
$str
=
'[a-z]'
;

3.
$str
=preg_replace(
'/\G[a-z]\E/'
,
''
,
$str
);

4.
echo
$str
;
//打印空,全被替换掉了,相关大概就是preg_quote功能


1.
//给匹配结果命名,这样在匹配结果中就可以用这个名称来获取值

2.
$str
=
'abc123abc'
;

3.
preg_match(
'/(?P<num>\d+)/'
,
$str
,
$arr
);

4.
echo
$arr
[
'num'
];
//相当于echo $arr[1]


1.
//仅用于分组的括号,匹配内容不会被变量捕获,有时候需要这样提高执行效率

2.
$str
=
'abc123abc'
;

3.
preg_match(
'/abc(?:\d+)/'
,
$str
,
$arr
);

4.
echo
$arr
[1];
//除了$arr[0]外没有$arr[1]了,不会赋予\1


1.
//插入的好帮手,向前、向后锚点搜索位置,每3位添加一个逗号

2.
$str
=
'fdfad123456789fdfd'
;

3.
$str
=preg_replace(
'/(?<=\d)(?=(\d{3})+(?!\d))/'
,
','
,
$str
);

4.
echo
$str
;
//打印 fdfad123,456,789fdfd


1.
//以最少的结果匹配

2.
$str
=123456;

3.
preg_match(
'/\d+/'
,
$str
,
$arr
);

4.
echo
$arr
[0];
//是人都知道是123456吧

5.
preg_match(
'/\d+?/'
,
$str
,
$arr
);

6.
echo
$arr
[0];
//这次是1


01.
//一个比较有用的,可以判断前面的是否有匹配过,比如下边的例子,可以忽略等号右边是否有单引号双引号或者什么都没有

02.
$str
=<<<HTML 

03.
<font size=12></font>

04.
<font size=
'13'
></font>

05.
<font size=
"14"
></font>

06.
<font size="15></font>

07.
HTML;

08.
preg_match_all(
'/<font\s+size=([\'"]?)(\d+)\1[^>]*>/'
,
$str
,
$arr
);

09.
print_r(
$arr
);

10.
/*

11.
Array

12.
(

13.
[0] =>12 

14.
[1] =>13 

15.
[2] =>14 

16.
)

17.
*/


01.
//部分模式修饰符,模式修饰符也可以放在表达式中的

02.
//这里匹配符合XHTML规范的style里的颜色值,大写的STYLE被忽略了,但是里面的color可以大小写无所谓

03.
$str
=
'<b style="COLOR:red"></b><b STYLE="color:blue"></b><b style="color:green"></b>'
;

04.
preg_match_all(
'/style=([\'"]?)(?i)color:(\w+)\1(?-i)/'
,
$str
,
$arr
);

05.
print_r(
$arr
[2])

06.
//也可以把匹配内容放到里面,用:隔开,就不用写结束(?-i)

07.
//preg_match_all('/style=([\'"]?)(?i:color:(\w+))\1/',$str,$arr);

08.
//再看一例子

09.
$str
=
'<B>Style</B>'
;

10.
preg_match(
'/<B>(?i:style)<\/B>/'
,
$str
,
$arr
);

11.
print_r(
$arr
);
//可以匹配到

12.
$str
=
'<B>Style</b>'
;

13.
preg_match(
'/<B>(?i:style)<\/B>/'
,
$str
,
$arr
);

14.
print_r(
$arr
);
//什么都没匹配到


1.
//单词检索,可惜只能用在英文

2.
$str
=
'I\'m a teacher'
;

3.
preg_match_all(
'/\b[a-z]+\b/i'
,
$str
,
$arr
);

4.
print_r(
$arr
);


01.
//u修饰符,按unicode匹配

02.
$str
=
'你您'
;

03.
$str
=preg_replace(
'/[你您]/'
,
'you'
,
$str
);

04.
echo
$str
;
//被拆开了,打印4次you

05.
//看下面加上u修饰符后的效果,该修饰符需要编码utf-8否则会报错

06.
//我的文本都是gb2312,所以要转成utf-8

07.
$str
=iconv(
'gb2312'
,
'utf-8'
,
'你您'
);

08.
$regex
=iconv(
'gb2312'
,
'utf-8'
,
'/[你您]/u'
);

09.
$str
=preg_replace(
$regex
,
'you'
,
$str
);

10.
echo
$str
;
//打印2次you


1.
//x模式修饰符,可以忽略空白和加注释

2.
$str
=
'test Test'
;

3.
preg_match(
'/test  #只匹配小写的test/x'
,
$str
,
$arr
);

4.
print_r(
$arr
);


01.
//排除环视(?<!...)(?!...)、忽略优先 *? +? ?? 的复合使用 

02.
$str
=
'test <B>test1<B>test2</B>'
;

03.
preg_match(
'/<B>(?:.(?<!<B>))*<\/B>/i'
,
$str
,
$arr
);

04.
//或者 preg_match('/<B>(?:(?!<B>).)*<\/B>/i',$str,$arr);

05.
print_r(
$arr
)

06.
//当时这样写应付不了 $str ='test <B>test1<B>test2</B>test3</B>';

07.
//改写一下正则既可 preg_match_all('/<B>(?:(?!<\/?B>).)*<\/B>/i',$str,$arr);

08.
//根据上面来完成一个最简单的UBB替换

09.
$str
=
'test test1[b] test2 test3[/b]test'
;

10.
$str
=preg_replace(
'/\[B\]((?:(?!\[\/?B\]).)*)\[\/B\]/i'
,
'<b>\1</b>'
,
$str
);

11.
$str
=preg_replace(
'/\[B\]((?:(?!\[\/?B\]).)*)\[\/B\]/i'
,
'<b>\1</b>'
,
$str
);

12.
print_r(
$str
);


1.
//如果已经确认回朔并不会有匹配结果,可以使用固化分组来放弃备用状态提高效率

2.
$str
=
'Subject'
;

3.
preg_match(
'/(\w+):/'
,
$str
,
$arr
);

4.
//用以下方法代替

5.
//在第一组匹配规则匹配到文本末尾t时匹配结束,启用第二组匹配规则:并不会找到结果,所以这个时候回朔查找,但是\w不会包含:,所以可以直接放弃,

6.
preg_match(
'/(?>\w+):/'
,
$str
,
$arr
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: