php preg正则表达式的组成部分

定界符号
多种都可以,常用为//

原子
最小的一个匹配单位 (放在定界符中),在一个正则表达式中,至少要有一个原子
1,打印字符(a-z A-Z 0-9 ~!@#$%^&*()_+...)和非打印字符
2, 代表一类字符
\d :任意一个数字 [0-9]
\D :任意一个非数字 [^0-9]
\w :任意一个字 a-z A-Z 0-9 _ [a-zA-Z0-9_]
\W :任意一个非字 [^a-zA-Z0-9_]
\s :代表任意一个空白 [\t\n\f\v]
\S :代表任意一个非空白 [^\t\n\f\v]

[\x{4e00}-\x{9fa5}]:代表所有汉字,但是需要配合模式修正符u使用,不然会报错


3,自定义原子表
[fws3] :fws3任意一个字符
[^1-9a-z] :非1-9 a-z的任意一个字符
[2-9x] :2-9或者x的任意一个字符
4,点(.) 能代表所有任意一个字符

元字符
不是单独使用的,是用来扩展和限定原子的 (写在定界符号中)
* 用来修饰其前面的原子可以出现0个或多个(任意次) {0,}
+ 用来修饰其前面的原子出现1次或多次 {1,}
? 用来修饰前面的原子出现0次或1次 {0,1}
{n} 用来修饰其前面的原子出现n次
{n,m} 用来修饰其前面的原子出现n到m次,包括n和m
{n,} 用来修饰其前面的原子至少出现n次,包括n
| 是或的关系 ,表示它两边的原子,只要一个出现就可以了,但是 | 优先级是最低的
^ 或 \A 表示必须以什么开始,这个必须写在正则表达式的最前面
$ 或 \Z 表示必须以什么结束,这个必须写在正则表达式的最后面
\b 单词边界
\B 不是单词边界的部分

 

模式修正符 (单个字符)
1,模式修正符写在定界符号 ,放在右边 "/go*gle/i"
2,模式修正符号,一个字符就是一个功能,可以组合使用
作用:
修正正则表达式的解释,或扩充正则表达式的功能
i : 不区分大小写
s : 原子. 可以匹配换行符(\r)
x : 去除正则表达式里的空白
U :让 原子. 变得不贪婪 (在. 后面加? 也可以取消贪婪模式,即.*? 或.+?)

u:utf8编码。匹配汉字时使用
其他符号

() (括号)
1,改变优先级
2, 将小原子变成大原子
3,子模式,整个表达式是一个大的模式,小括号中是每个独立的子模式
4,反向引用
$preg = '/title\=\"(.+?)\"\>(\\1)\<\/a\>/'; //  \\1:引用匹配的第一个子模式的内容


\1引用前面括号里的模式,即第一个模式 (?:xxx)使括号失去3,4功能


\ (转义字符)
1,可以将有意义的字符转成没有意义的原子字符 \^ \. \+ \' \" \?
2, 可以将没有意义的字符转成有意义的原子 \t \cx \f \n \r \v
3, 加上 \也没意义的字符,加不加\都没区别 \_ \q

实例
匹配网址
$reg = "/(https?|ftps?)\:\/\/(www|mail|bbs)\.(.+?)\.(com|cn|net)([\w\-\/\.\=\?\&\%]*)?/i";

preg_match("/^([\x{4e00}-\x{9fa5}]|\w|\_|\-){2,18}$/u",$_GET['name'] )

匹配邮箱
$reg = "/\w+([+-.]\w+)*@\w+([-.]\w+)*/";

 

函数

正则的查找
preg_match(pattern, subject ,data); //查找一个
preg_match_all(pattern, subject, data); //查找所有

正则的分割
preg_split(pattern, subject);

正则的替换
preg_replace(pattern, replacement, subject);

 

 

 

 

 

//一些心得

编码的问题,如果正则表达式和内容编码不同,会导致匹配不出,这时要将正则表达式\内容 转码

iconv('utf-8','gbk','/\&pn\=73\"\>尾页\<\/a\>/')

posted @ 2018-07-27 18:02  cl94  阅读(756)  评论(0编辑  收藏  举报