正则表达式简介
- 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。PHP函数查找也是一种正则表达式。
- PHP正则就是用来模糊匹配或者精确匹配的一种手段。在现实中会经常遇到这种手段,比如去注册一个网站,你输入的用户名,网站会告诉你不合法,或者长度不够等等。这些都可以用正则表达式做到
- 正则表达式也是网站中常用的一种技术手段,就是为了检测一些非法的,不合规的字符串所使用的。
- 在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述。
- PHP中,正则表达式有三个作用:
- 匹配,也常常用于从字符串中析取信息。
- 用新文本代替匹配文本。
- 将一个字符串拆分为一组更小的信息块。
- 一个正则表达式中至少包含一个原子(一个内容,也就是一个匹配的东西、一个A、一个通配符、等等)。
-
在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:
- 一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用
preg_
为前缀命名的函数,它的效率比较高,推荐。 - 一套由POSIX(Portable Operating System Interface of Unix )扩展提供的。使用以
ereg_
为前缀命名的函数; - PCRE 来源于 Perl 语言,而 Perl 是对字符串操作功能最强大的语言之一,PHP 的最初版本就是由Perl开发的产品,后来用 C 语言重写(你需要了解下)
- PCRE 语法支持更多特性,比 POSIX 语法更强大。
- 一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用
* 正则表达式的语法规则
1. 定界符
- 在程序语言中,使用与 Perl 兼容的正则表达式,通常都需要将模式表达式放入定界符之间,如“/”。
- 定界符可以理解为一个边界,这个边界有开始有结束。
- 当放入这个边界之后,程序就知道了在这个边界内部,是你写的正则表达式。这就是定界符的作用。
- 作为定界符常使用斜线 “
/
”,如 “/apple/
” 。用户只要把需要匹配的模式内容放入定界符之间即可。作为定界的字符也不仅仅局限于 “/”。除了字母、数字和斜线 “\” 以外的任何字符都可以作为定界符,像 “#”、“|”、“!” 等都可以的。(但是都不推荐使用,只推荐“/
”)
2. 原子
- 原子是正则表达式的最基本的组成单元,而且在每个模式中最少要少包含一个原子。
- 就像我们写英文单词一样,我们26个英文字母就是一个最基本的单元,通过这些字母可以组合成所有的单词。
- 正则表达式也一样。原子就是正则表达式最基本单元的组成单元。
- 并且在每一个模式中,至少要包含一个原子。就像英文单词一样,最少需要一个英文字母。
- 原子是由所有那些未显示指定为元字符的打印字符(能输出,能打印的)和非打印字符(看不见的,比如换行符等)组成,具体分为5类。
- 普通字符作为原子: 如 a ~ z、A ~ Z、0~9 等
- 一些特殊字符和转义后元字符作为原子:所有标点符号,但语句特殊意义的符号需要转义后才可作为原子,如:\” \’ * + ? . (都是通配符,需要转义后,可以输出、直接打印)等
- 一些非打印字符作为原子: 如:\f \n (常用) \r(常用) \t \v \cx
- 使用“通用字符类型”(一个表示多个)作为原子:如:\d \D \w \W \s \S。
- 自定义原子表([])作为原子:如:’/[apj]sp/’ ’/ [ ^apj ] sp/’
常用的非打印字符
原子字符 | 含义描述 |
---|---|
\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 |
常用的通用打印字符
原子字符 | 含义描述 |
---|---|
\d | 匹配任意一个十进制数字,等价于 [0-9] |
\D | 匹配任意一个除十进制以外的字符,等价于 [^0-9] |
\s | 匹配任意一个空白符,等价于 [\f\n\r\t\v] |
\S | 匹配除空白符以外任何字符,等价于 [^\f\n\r\t\v] |
\w | 匹配任意一个数字,字母或下s画线,等价于 [0-9a-zA-Z] |
\W | 匹配一个数字、字母或下划线以外的任意一个字符,等价于 [^0-9a-zA-Z] |
3. 元字符
元字符 | 含义描述 |
---|---|
* | 匹配0次、1次或多次其前的原子(\d\d => \d*) |
+ | 匹配1次或多次其前的原子 (和 * 基本一样,至少会有一次) |
? | 匹配0次或1次其前的原子(要么没有,要么只有一位) |
. | 匹配除了换行符外的任意一个字符 |
| | 匹配两个或多个分支选择(或的意思,前面写个原子,后面写个原子,两者选一) |
{n} | 表示其前面的原子正好出现n次(举例、匹配3位的整数:\d{3}) |
{n,} | 表示其前面的原子出现不小于n次 |
{n,m} | 表示其前面的原子至少出现n次,最多出现m次(举例、3到5位字符串:\w{3,5}) |
^ 或 \A | 匹配输入字符串的开始位置(或是多行模式下行的开头,即紧随一个换行符之后:^http) |
$ 或 \Z | 匹配输入字符串的结束位置(或是多行模式下行的结尾,即紧随一个换行符之前:com$) |
\b | 匹配单词的边界 |
\B | 匹配除单词边界以外的部分 |
[] | 匹配方括号中指定的任意一个原子 ([abc]) |
[^] | 匹配除方括号中的原子以外的任意一个字符([^abc]) |
() | 匹配其整体为一个原子,即模式单元。可以理解为由多个单子原子组成的大原子((http)) |
4. 字符串边界限制
- 在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果。
^
和$
分别指定字符串的开始和结束。 - 例如,在字符串“Tom and Jerry chased each other in the house until Tom’s uncle come in”中
- 元字符
^
或\A
置于字符串的开始确保模式匹配出现在字符串首端:/^Tom/
- 元字符
$
或\Z
置于字符串的结束,确保模式匹配出现字符串尾端:/in$/
- 如果不加边界限制元字符,将获得更多的匹配结果。
/^Tom$/
精确匹配、/Tom/
模糊匹配
- 元字符
5. 单词串边界限制
- 在使用各种编辑软件的查找功能时,可以通过选择“按单词查找”获得更准确的结果。正则表达式中也提供类似的功能。
- 例如:在字符串“This island is a beautiful land”中
- 元字符
\b
对单词的边界进行匹配; /\bis\b/
匹配单词 “is”,不匹配 “This” 和 “island”。/\bis/
匹配单词“is”和“island”中的 “is”,不匹配 “This”。- 元字符
\B
对除单词边界以外的部分进行匹配。 /\Bis\B/
将明确的指示不与单词的左、右边界匹配,只匹配单词的内部。所以在这个例子中没有结果。/\Bis/
匹配单词 “This” 中的 “is”。
- 元字符
6. 重复匹配(?
、*
、+
)
- 正则表达式中有一些用于重复匹配某些原子的元字符:
?
、*
、+
。他们主要的区别是重复匹配的次数不同。 - 元字符
?
:表示0次或1次匹配紧接在其前的原子。例如:/colou?r/
匹配 “colour” 或 “color”。 - 元字符
*
:表示0次、1次或多次匹配紧接在其前的原子。例如:/zo*/
可以匹配z、zoo。 - 元字符
+
:表示1次或多次匹配紧接在其前的原子。例如:/go+gle/
匹配“gogle”、“google”或“gooogle”等中间含有多个o的字符串。
7. 任何一个字符( .
)
- 元字符
.
匹配除换行符外任何一个字符。- 相当于:
[^\n]
(Unix系统)或[^\r\n]
(windows系统)。 - 例如:
/pr.y/
可以匹配的字符串“prey”、“pray”或“pr%y”等。
- 相当于:
- 通常可以使用
.*
组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符” 或 “单含匹配符”。- 例如:
/^a.*z$/
表示可以匹配字母“a”开头,字母“z”结束的任意不包括换行符的字符串。 /.+/
也可以完成类似的匹配功能所不同的是其至少匹配一个字符。/^a.+z$/
匹配“a%z”不匹配字符串“az”。
- 例如:
8. 重复匹配({}
)
- 元字符
{ }
准确地指定原子重复的次数,指定所匹配的原子出现的次数。{m}
表示其前原子恰好出现m次。{m,n}
表示其前原子至少出现m次,至多出现n次。{m,}
表示其前原子出现不少于m次。
- 举例说明:
/zo{1,3}m/
只能匹配字符串“zom”、“zoom”、或“zooom”。/zo{3}m/
只能匹配字符串“zooom”。/zo{3,}m/
可以匹配以 “z” 开头,“m”结束,中间至少3个“o”的字符串/bo{0,1}u/
可以匹配字符串“bought a butter” 中的“bou”和“bu”,等价于bo?u。
9. 原子表([-]
)
- 原子表
[-]
用于连接一组按ASCII码顺序排列的原子,简化书写。 - 举例说明:
/x[0123456789]/
可以写成x[0-9]
,用来匹配一个由 “x” 字母与一个数字组成的字符串。/[a-zA-Z]/
匹配所有大小写字母/^[a-z][0-9]$/
匹配比如“z2”、 “t6” 、“g7”/0[xX][0-9a-fA-F]/
匹配一个简单的十六进制数字,如“0x9”。/[^0-9a-zA-Z_]/
匹配除英文字母、数字和下划线以外任何一个字符,其等价于\W
。/0?[ xX][0-9a-fA-F]+/
匹配十六进制数字,可以匹配“0x9B3C”或者“X800”等。/<[A-Za-z][A-Za-z0-9]*>/
可以匹配<p>
,<h1>
或<body>
等。
10. 模式选择符(|
)
- 元字符
|
又称模式选择符。在正则表达式中匹配两个或更多的选择之一。 - 在字符串“There are many apples and pears.”中,
/apple|pear/
在第一次运行时匹配“apple”; - 再次运行时匹配“ pear”。也可以继续增加选项,如:
/apple|pear|banana|lemon/
11. 模式单元(()
)
- 待更新
与 Perl 兼容的正则表达式函数
- 待更新