php的正则

加油吧!Davidvivi

<?php 


PHP 中的正则表达式

==========================================================

1. 正则表达式简介

1.1 什么是正则

1. /^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_-]+){0,3}$/ 就是正则   

2.正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。

3.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述。


1.2 正则表达式的作用

1.匹配,也常常用于从字符串中析取信息。

2.用新文本代替匹配文本。

3.将一个字符串拆分为一组更小的信息块。

1.3 学习正则的流程

1.语法学习

2.函数学习

1.4 正则的故事

1.在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:

一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用“preg_”为前缀命名的函数;

一套由POSIX(Portable Operating System Interface of Unix )扩展提供的。使用以“ereg_”为前缀命名的函数;

        2.PCRE来源于Perl语言,而Perl是对字符串操作功能最强大的语言之一,PHP的最初版本就是由Perl开发的产品。

3.PCRE语法支持更多特性,比POSIX语法更强大。

1.5 与Perl语言兼容的正则表达式处理函数

preg_match() 进行正则表达式匹配

preg_match_all() 进行全局正则表达式匹配

preg_replace() 执行正则表达式的搜索和替换

preg_split() 用正则表达式分割字符串

preg_grep() 返回与模式匹配的数组单元

preg_replace_callback() 用回调函数执行正则表达式的搜索和替换



2. 正则表达式的语法规则

2.1  定界符

1.在程序语言中,使用与Perl兼容的正则表达式,通常都需要将模式表达式放入定界符之间,如“/”。

2.作为定界的字符也不仅仅局限于“/”。除了字母、数字和斜线“\”以外的任何字符都可以作为定界符,像  ‘#’、’|’、’!’ 等都可以的。


2.2  原子

原子是正则表达式的最基本的组成单元,而且在每个模式中最少要少包含一个原子。

1. 普通字符作为原子: 如 a~z、A~Z、0~9 等

2. 一些特殊字符和转义后元字符作为原子:

所有标点符号,但语句特殊意义的符号需要转义后才可作为原子,如:\” \’ \* \+ \? \. 等

3. 一些非打印字符作为原子:

如:\f \n  \r \t \v \cx

原子字符含义描述

\cx匹配由x指明的控制字符。如\cM匹配一个Control-M或回车符。x的值必须为A~Z或a~z之一。

\f匹配一个换页符。等价于 \x0c或\cL

\n匹配一个换行符。等价于 \x0a或\cJ

\r匹配一个回车符。等价于 \x0d或\cM

\t匹配一个制表符。等价于 \x09或\cI

\v匹配一个垂直制表符。等价于 \x0b或\cK

4. 使用“通用字符类型”作为原子:如:\d \D \w \W \s \S。

原子字符含义描述

\d匹配任意一个十进制数字,等价于[0-9]

\D匹配任意一个除十进制数字以外的字符,等价于[^0-9]

\s匹配任意一个空白符,等价于[\f\n\r\t\v]

\S匹配除空白符以外任何字符,等价于[^\f\n\r\t\v]

\w匹配任意一个数字、字母或下画线,等价于[0-9a-zA-Z_]

\W匹配一个除数字、字母或下画线以外的任意一个字符,等价于[^0-9a-zA-Z_]

5. 自定义原子表([])作为原子:如:’/[apj]sp/’ ’/[^apj]sp/’   []   [^]

2.3  元字符

元字符含义描述

*匹配0次、1次或多次其前的原子

+匹配1次或多次其前的原子

匹配0次或1次其前的原子

.匹配除了换行符外的任意一个字符

|匹配两个或多个分支选择

{n}表示其前面的原子恰好出现n次

{n,}表示其前面的原子出现不小于n次

{n,m}表示其前面的原子至少出现n次,最多出现m次

^或\A匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一个换行符之后)

$或\Z匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一个换行符之前)

\b匹配单词的边界

\B匹配除单词边界以外的部分

[]匹配方括号中指定的任意一个原子

[^]匹配除方括号中的原子以外的任意一个字符

( )匹配其整体为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子

1. 字符串边界限制

元字符“^”或“\A” 置于字符串的开始确保模式匹配出现在字符串首端;

元字符“$”或“\Z” 置于字符串的结束,确保模式匹配出现字符串尾端。

2. 单词边界限制

元字符“\b”对单词的边界进行匹配;

元字符“\B”对除单词边界以外的部分进行匹配。

3. 重复匹配

元字符“?”:表示0次或1次匹配紧接在其前的原子。

元字符“*”:表示0次、1次或多次匹配紧接在其前的原子。

元字符“+”:表示1次或多次匹配紧接在其前的原子。

4. 任何一个字符

元字符“.”匹配除换行符外任何一个字符。

通常可以使用“.*”组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符” 或 “单含匹配符”。

5. 重复匹配

元字符“{ }”准确地指定原子重复的次数,指定所匹配的原子出现的次数。

 “{m}”   表示其前原子恰好出现m次。

 “{m,n}”表示其前原子至少出现m次,至多出现n次。

 “{m,}” 表示其前原子出现不少于m次。

6. 原子表 -方括号表达式

原子表”[]”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。

原子表 ”[^]” 或者称为排除原子表,匹配除表内原子外的任意一个字符。

原子表“[-]”用于连接一组按ASCII码顺序排列的原子,简化书写。  

7. 模式选择符

元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。

8. 模式单元

元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以做一个单元被单独使用。

9. 重新使用的模式单元 

系统自动将模式单元“()”中的匹配依次存储起来,在需要时可以用“\1”、“\2”、“\3”的形式进行引用。

当正则表达式包含有相同的模式单元时,这种方法非常便于对其进行管理。注意使用时需要写成“\\1”、“\\2”

当不需要存储匹配结果时使用非存储模式单元“(?:)” 

例如/(?:a|b|c)(D|E|F)\\1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。

10. 模式匹配优先级

顺序元字符描述

1\转义字符

2()  (?:)  (?=)  []模式单元和原子表

3*  +   ?  {n}  {n,} {n,m}重复匹配

4^  $  \b  \B  \A   \Z边界限制

5|模式选择

2.4  模式修正符

修正符含义描述

i在和模式进行匹配时不区分大小写

m将字符串视为多行。默认的正则开始“^”和结束“$”将目标字符串作为单一的一“行”字符。加上m后,那么开始和结束将会指字符串的每一行。

s如果设定了此修正符,模式中的圆点元字符“.”匹配所有的字符,包括换行符。即将字符串视为单行,换行符作为普通字符看待

x模式中的空白忽略不计,除非它已经被转义

e只用在preg_replace()函数中,在替换字符串中对逆向引用做正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

U本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (U) 修正符或者在数量符之后跟一个问号(如启.*?)来用此选项。



3. 与Perl兼容的正则表达式函数

3.1  子符串的匹配与查找函数

preg_match()     只匹配一次,返回匹配的次数0或1

preg_match_all()  返回0或匹配到字符的个数

preg_grep()

3.2  字符串的替换函数

preg_replace()

preg_replace_callback()

preg_filter()

3.3  字符串的分割与连接

preg_split()

3.4 其他

preg_quote()

preg_last_error()


好用的正则工具http://regexpal.isbadguy.com/






打赏,支持一下

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by WEIXIA.XIN,学的不仅是技术,更是梦想!!!

Davidvivi博客
请先登录后发表评论
  • 最新评论
  • 总共 0条评论