正则表达式 小计
一、概述
正则表达式(也称模式表达式)是具有语法结构的字符串,自身具有一套非常完整的、可以编写模式的语法体系,提供了一种灵活且直观的字符串处理方法。
通过构建具有特定规则的模式,与输入的字符串信息进行比较,在特定的函数中使用,从而实现字符串的匹配、查找、替换及分割等操作。
用途:
1.网络爬虫.
2.验证.
PHP中支持两套正则表达式的处理函数库:
PCRE 和 POSIX
PCRE (Perl Compatible Regular Expression)
1、PCRE函数库正则语法与perl正则语法兼容,表达式都应包含在定界符中.
2、PCRE函数库效率相对高.安全性高.
POSIX (Protable Operation System interface)
不建议使用.
二、正则语法.
1、正则表达式的组成
- 定界符
- 原子(普通字符,例如字符a~z)
- 元字符(有特殊功能的字符,如*、+、?等)
- 模式修正符
2、定界符
定界符是一个正则表达式中,必须具有的语法组成,定界符在正则表达式中要求成对出现,定界符可以除了 数字 , 字母 ,反斜线 \ 之外的任何字符。
例如:{},##,||
项目中常用一对正斜线来代表定界符://。
3、原子
原子是正则表达式中的最小组成单位,一个正则表达式要想有意义,则至少有一个原子。
由所有那些未显示指定为元字符的打印和非打印字符(一些在字符串中的格式控制符号)组成。
- 3.1、所有的打印字符都可以被称为原子.
- 3.2、需要进制转义的原子:如,元字符,/
任何一个符号都可以作为原子使用,但如果这个符号在正则表达式中有一些特殊意义,必须使用转义字符 \ 取消它的特殊意义,将其变成一个普通的原子; 如,所有标点符号和一些其他符号 , 单引号 双引号 * + .等 作为原子使用 \" \' \* \+ \.
- 3.3、具有特殊含义的原子(一个原子匹配一类字符,类原子).
\d :所有的十进制数字原子
\D :所有的非十进制数字,等价于 [^0-9]
\w :所有的数字、字母、下划线,等价于[0-9a-zA-Z_]
\W :所有的非数字、字母、下划线
\s :所有的空白字符,等价于[\f\n\r\t\v]
\S :所有的非空白字符
- 3.4、自定义原子表[ ](自定义“ 类原子 ”,代表一组原子中的一个)
[ ],在自定义原子表中可以表示原子之间或的关系,还可以用于指定原子匹配的范围,彼此地位平等,且从原子表中仅选择一个原子进行匹配.
例如: [0-9]匹配数字0~9。
[a-z] 用于匹配26个小写英文字母。
[A-Z] 用于匹配26个大写英文字母。
[0-9a-z] 匹配数字0~9和26个小写的英文字母。
在自定义原子表中 ^ 代表非.
- 3.5、非打印字符(一些在字符串中的格式控制符号,如,\n 换行)
4.元字符
元字符(特殊含义的字符)是用于修饰正则表达式中的原子的,不能单独出现,必须用来修饰原子,若要包含元字符本身,需\转义、
4.1、限定符
* 被*修饰的原子可以出现0次或者多次.
+ 被+修饰的原子可以出现1次或者多次.
? 被?修饰的原子可以出现0次或者1次.
{n} 被{n}修饰的原子可以出现正好n次.
{n,m} 被{n,m}修饰的原子,至少可以出现n次(含n次),最多出现m次(含m次)
{n,} 被{n,}修饰的原子,至少出现n次{n,},至多不限制.
4.2、边界限制(限定字符串或单词的边界范围)
^和\A ,以^或\A来修饰的原子作为字符串起始。
$和\Z ,以$或\Z来修饰的原子作为字符串结尾。
\B和\b,其中\B代表非字符边界,\b代表了字符边界。
4.3、句号 .
匹配目标中的任何一个字符,包括不可打印字符,但不匹配换行符(默认情况下)。如果设定了模式修正符s,则也会匹配换行符;
使用 .*? 或 .+? 组合匹配除换行符以外的任何一个字符串
4.4、小括号() 模式单元符 (将多个原子组成大的原子,被当做一个单元独立使用)优先匹配;且也是个表达式, 向后引用
- 可以改变匹配的范围.
- 反向引用:
1、 加括号将导致相关匹配存储到一个临时缓冲区,可被获取供,以后使用
2、 所捕获的每个子匹配都按照在正则表达式模式中从左到右所遇到的内容存储
3、 存储子匹配的缓冲区编号从1 开始,连续编号直至最大99个子表达式
4、 每个缓冲区都可以使用 \n 访问,n为一个标识特定缓冲区的一位或两位十进制数。在正则表达式模式中使用时还需要在前面加一个反斜线,将反斜线再次转义,如 \\n
5、 当使用模式单元而又不想要存储匹配结果时,可以使用非捕获元字符“ ?: ”、" ?= " 或 “?!’”来忽略对相关匹配的保存;如,/(?:windows)(Linux)\\1OS/ ?: 忽略了第一个子表达式的存储,\\1引用的是Linux
4.5、 | 或(模式选择符)优先级最低,左右整体或的关系
- 分隔多选一模式
- LAMP|J2EE 匹配LAMP 或 J2EE 而不是 LAMP2EE 或 LAMJ2EE
5.模式修正符
模式修正符是用来修正正则表达式的,模式修正符写在正则表达式定界符的外面,
模式秀正符可以组合使用。
建议用 .*? 代替 U
三、应用
匹配查找,替换,分割
普通字符串处理函数.
1.简单,效率高.
2.功能相对不够完善.
正则表达式处理函数.
1.复杂,效率低.
2.功能强大.
原则:能用普通字符串处理函数完成的工作,就不要用正则表达式处理函数完成.
1、匹配查找
strstr(string $haystack,string $needle,bool $bool = false)
功能:在haystack查找needle首次出现的位置,返回从needle开始剩余的字符串.
参数:
haystack 原字符串
needle 要查找的子字符串
bool true返回之前的部分
返回:从needle开始剩余的字符串. 大小写敏感;若要大小写不敏感使用stristr(),找不到返回false
strpos(string $haystack,string $needle)
功能:从haystack查找needle首次出现的位置. 大小写敏感,相比strstr()速度更快、耗费内存更少
参数:
haystack 原字符串
needle 查找的子字符串.
返回:位置,找不到 返回false
strrpos() 最后一次出现
substr(string $haystack,int $start[,int length])
功能:字符串的截取
参数:
haystack 原字符串
start 截取的起始位置.
length 截取的长度,默认截取到字符串尾.
preg_match_all($pattern,$subject[,array $match])
功能:正则匹配,一直搜索到指定字符串的结尾。
参数:
pattern 正则表达式
subject 原子符串.
match 正则匹配到的结果.
返回: 正则匹配到的次数.
preg_match(string $pattern, string $subject[,array $match])
功能:正则匹配,在第二个字符串中搜寻与第一个参数给出的正则表达式匹配的内容。
在第一次匹配之后就会停止搜索。
如果给了第三个参数,将保存与第一个参数中的子模式(用括号括起来的模式单元)的各个部分匹配的结果。
$match[0] 保存了正则表达式 pattern 匹配的整体内容。其他元素则按顺序依次保存了正则表达式小括号内子表达式相匹配的内容。
参数:
pattern 正则表达式
subject 原子符串.
match 正则匹配到的结果.
返回: 只做一次匹配,返回正则匹配到的次数.(0~1)
preg_grep(string $pattern,array $input)
功能:用正则表达式匹配input数组中的元素,返回匹配到的结果.
参数:
pattern 正则表达式
input 进行正则匹配的数组.
返回: 匹配到的结果.
2、分割
explode(string $delimiter,string $str[,int $limit])
功能:字符串的分割
参数:
delimiter 分割标识符
str 要进行分割的原字符串
limit 分割的份数
返回:分割后的结果.数组.
注意:delimiter不能是空字符串.
implode/join
将数组结合成字符串.
preg_split(string $pattern,string $subject[,int $limit])
功能:正则分割
参数:
pattern 正则表达式
subject 进行分割的原字符串.
limit 正则分割的份数.
返回:正则分割后的结果,数组,包含通过第二个参数中的字符串,经第一个参数的正则表达式。
还可以指定第四个参数:
3、替换
str_replace(mixed $search,mixed $replace,mixed $subject)
功能:字符串的替换函数.
参数:
search 查找的字符串.
replace 替换的字符串
subject 原字符串.
返回:替换后的结果.
str_ireplace() 不区分大小写
preg_replace(string $pattern,mixed $replace,mixed $subject,[int limit])
功能:正则替换. 在第三个参数中搜索第一个参数模式的匹配项,并替换为第二个参数,第四个参数指定替换次数
参数:
pattern 正则表达式.
replace 进行替换的字符串.
subject 原子符串.
limit 替换次数,默认-1
返回:替换后的字符串.
四、实例
PHP正则匹配汉字(UTF-8和GBK两种编码) :
//GBK/GB2312编码 EUC-CN
preg_match_all("/[x80-xff]+/", $str, $match);
//UTF-8 使用:UTF-8
preg_match_all("/[\x{4e00}-\x{9fa5}]+/u", $str, $match);
分情破爱始乱弃,流落天涯思别离。
如花似玉负情意,影如白昼暗自迷。
随风浮沉千叶落,行色匆匆鬓已稀。