东南亚(SEA)位于亚洲东南部,包括中南半岛和马来群岛两大部分。中南半岛因位于中国以南而得名,南部的细长部分叫马来半岛。马来群岛散布在太平洋和印度洋之间的广阔海域,是世界最大的群岛,共有两万多个岛屿,分属印度尼西亚、马来西亚、东帝汶、文莱和菲律宾等国。东南亚地区共有11个国家:越南、老挝、柬埔寨、泰国、缅甸、马来西亚、新加坡、印度尼西亚、文莱、菲律宾、东帝汶,面积约457万平方千米。其中老挝是东南亚唯一的内陆国,越南、老挝、缅甸与中华人民共和国陆上接壤,仅东帝汶不是东盟成员。
一、简介
正则表达式(
Regular Expression
,简写为regex
、regexp
或RE
),又称规则表达式,是计算机科学的一个概念,它通常被用来检索、替换那些符合某个模式(规则)的文本。
- 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。
- 正则表达式的三个作用:匹配、用新文本代替匹配文本、将一个字符串拆分为一组更小的信息块。
- 在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述。其有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:
- 一套是由
PCRE(Perl Compatible Regular Expression)
库提供的,使用preg_
为前缀命名的函数 - 灵一套由
POSIX(Portable Operating System Interface of Unix)
扩展提供的,使用以ereg_
为前缀命名的函数
- 一套是由
二、语法分类
- 分隔符:当使用 PCRE 函数的时候,模式需要由分隔符闭合包裹,分隔符可以使任意非字母数字、非反斜线、非空白字符。
- 经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)。
- 元字符
- 在模式中方括号外使用(
\
,^
,-
) - 在模式中方括号内使用(
\
,^
,$
,.
,[]
,|
,()
,{}
,?
,*
,+
)
- 在模式中方括号外使用(
三、元字符详解
转义字符(
\
),有多种用法- 第一种用法是紧接着是一个非字母数字字符,表明取消该字符所代表的特殊涵义。将反斜线作为转义字符的用法在字符类内部和外部都可用
- 如匹配一个
"*"
字符,就需要在模式中写为"\*"
- 如匹配一个反斜线,那么在模式中使用
”\\”
- 第二种用法是提供了一种对非打印字符进行可见编码的控制手段
- 第三种用法是用来描述特定的字符类
- \d:任意十进制数字
- \D:任意非十进制数字
- \w:任意单词字符
- \W:任意非单词字符
- \s:任意空白字符
- \S:任意非空白字符
- \v:任意垂直空白字符(since PHP 5.2.4)
- \V:任意非垂直空白字符(since PHP 5.2.4)
- \h:任意水平空白字符(since PHP 5.2.4)
- \H:任意非水平空白字符(since PHP 5.2.4)
- 第四种用法是一些简单的断言
- \b:单词边界,它匹配的字符串是一个完整的单词
- \B:非单词边界,它匹配的字串不能是一个完整的单词,而是其他单词或字串的一部分
- \A:目标的开始位置(独立于多行模式)
- \Z:目标的结束位置或结束处的换行符(独立于多行模式)
- \z:目标的结束位置(独立于多行模式)
- \G:在目标中首次匹配位置
行定位符(^与$):行定位符是用来描述字符串的边界。
- “^”表示行开始
- “$”表示行结尾
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32例一:
$str = 'abcdddddef124f';
$search = '/^abc([^xyz]*)$/';
$result = preg_match_all($search, $str, $match);
print_r($match);
Array
(
[0] => Array
(
[0] => abcdddddef124f
)
[1] => Array
(
[0] => dddddef124f
)
)
例二:
$s = 'abcddd';
$p = '/^abc/';
$r = preg_match_all($p, $s, $match);
print_r($match);
Array
(
[0] => Array
(
[0] => abc
)
)-
- 匹配目标字符串中的任意字符,包括非打印字符,但是(默认)不包括换行符
- 如果
PCRE_DOTALL
被设置,句点就会匹配换行符 - 句点在字符类中没有任何意义
\C
可以被用于匹配单字节, 也就是说在UTF-8模式下,句点可以匹配多字节字符。
-
- 一个字符类在目标字符串中匹配一个单独的字符
-
- 表示或的意思
- 注意
[]
与|
的区别,[]
只能匹配单个字符,而|
可以匹配任意长度的字符串 - 竖线可以在模式中出现任意多个,并且允许有空的可选路径(匹配空字符串)
- 匹配的处理从左到右尝试每一个可选路径,并且使用第一个成功匹配的
- 如果可选路径在子组(下面定义)中, 则”成功匹配”表示同时匹配了子模式中的分支以及主模式中的其他部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14$s = 'AaaAbAa';
$p = '/Aa|aA/';
$r = preg_match_all($p, $s, $match);
print_r($match);
Array
(
[0] => Array
(
[0] => Aa
[1] => aA
[2] => Aa
)
) -
- 将可选分支局部化
- 将子组设定为捕获子组,左括号从左至右出现的次序就是对应子组的下标(从
1
开始)
-
?
:零次或一次,等价于 {0,1}*
:零次或多次,等价于 {0,}+
:一次或多次,等价于 {1,}{n}
:n次{n,}
:至少n次{n,m}
:n到m次
排除字符(^)
- 表示排除不符合的字符
^
一般放在[]
中,如[^1-5]
,该字符不是1~5之间的数字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15$s = '6789';
$p = '/[^1-5]/';
$r = preg_match_all($p, $s, $match);
print_r($match);
Array
(
[0] => Array
(
[0] => 6
[1] => 7
[2] => 8
[3] => 9
)
)