1.基础知识:
正则表达式是一种描述文本所包含模式的方法。
使用PCRE正则表达式,每个表达式必须包含在一对分隔符中。你可以选择任何非字 母、数字、“\”或空格的字符作为分隔符。字符串的开始和结束必须有匹配的分隔符。
2.分隔符
最常用的分隔符是“/”。
匹配“shop”的正则表达式:/shop/
如果要在正则表达式中匹配字符“/”,需要使用来转义“/”:/shop\//
如果模式包含了多个分隔符,需要考虑选择不同的分隔符。我们可以用#作为分割符
在结束分割符后添加一个模式修饰符:/shop/i
2.字符类和类型
/ .at/:可以匹配“cat” “sat”和“mat”等字符串
要限定第一个字母是a到z之间的字符:/[a-z]at/
要限定第一个字母是 abc:/[abc]at/
/ [a-zA-Z] /:任何大小写字母
可以用来匹配任何不在a和z之间的字符:/a-z;()
表4-5用于PCRE风格正则表达式的字符类
类 | 匹配 | 类 | 匹配 |
---|---|---|---|
[[:alnum:]] | 文字数字字符 | [[:punct:]] | 标点符号 |
[[:alpha:]] | 字母字符 | [[:blank:]] | 制表符和空格 |
[[:asci:]] | ASCII字符 | [[lower:]] | 小写字母 |
[[:space:]] | 空白字符 | [[:upper:]] | 大写字母 |
[[:cntrl:]] | 控制符 | [[:digit:]] | 小数 |
[[:print:]] | 所有可打印的字符 | [[:xdigit:]] | 十六进制数字 |
[[:graph:]] | 除空格外所有可打印的字符 | [[:word::]] | “word”字符(字母、数字或下划线) |
3.重复
在正则表达式中,你可以使用三个特殊字符代替。符号*表示这个模式可以重复出 现0次或多次,符号“+”则表示这个模式可以重复出现1次或多次。“?”表示这个模式 可以出现1次或0次。
/[[:alnum:]]+/:最少出现一次
4.子表达式
/(very )*large/
你可以用在花括号({})中使用数字表达式来指定内容允许重复的次数。可以指定一个 确切的重复次数(例如,{3}表示重复3次),或者一个重复次数的范围({2, 4}表示重复 2〜4次),或是未指定最大范围的重复模式({2, }表示至少要重复两次)。
/(very ){1,3}/:very可以出现1到3次
5.定位:
……用于正则表达式的开始,表示子字符串必须出现在被搜索字符串的开始 处,&字符用于正则表达式的末尾,表示子字符串必须出现在字符串的末尾。
在字符串开始处匹配bob:/^bob/
匹配以com为结束的字符串:/com$/
6.分支
你可以在正则表达式中使用来表示模式选择。例如,如果要匹配com、edu或 net,就可以使用如下所示的表达式:
/com|edu|net/
在PHP中,必须使用单引号来引用正则表达式模式。使用双引号引用的正则表达式将 带来一些不必要的复杂性。PHP还使用反斜杠来转义特殊字符。如果希望在模式中匹配一 个反斜杠,必须使用两个反斜杠来表示它是一个反斜杠字符,而不是一个转义字符。
7.元字符
表4・6在PCRE正则表达式中,用于方括号外面的特殊字符 | |||
---|---|---|---|
字符 | 意义 | 字符 | 意义 |
\ | 转意字符 | ) | 子模式的结束 |
^ | 在字符串开始匹配 | * | 重复0次或更多次 |
$ | 在字符串末尾匹配 | + | 重复一次或更多次 |
. | 匹配除换行符(\n)之外的字符 | { | 最小/最大虽汜号的开始 |
| | 选择分支的开始(读为或) | ) | 最小/最大量记号的结束 |
( | 子模式的开始 | ? | 标记一个子模式为可选的 |
表4-7在PCRE正则表达式中,用于方括号里面的特殊字符
字 符 | 意 义 |
---|---|
\ | 转意字符 |
^ | 非,仅用在开始位置 |
_ | 用于指定字符范围 |
8.转义序列
表4・8 PCRE正则表达式的特殊字符类型
字符类型 | 含 义 | 字符类型 | 含 义 |
---|---|---|---|
\d | 十进制数字 | \S | 任意非空白字符 |
\D | 任意非十进制数字 | \v | 垂直空白字符 |
\h | 水平空白字符 | W | 任意非垂直空白字符 |
\H | 任意非水平空白字符 | \w | 单词字符 |
\s | 空白字符 | \W | 任意非单词字符 |
9.回溯引用(\1)
10.在[]内‘-’代表特殊意义,所以要用(-)而【】外用(.)
11.用正则表达式查找子字符串
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜索 subject 与 pattern 给定的正则表达式的一个匹配。
参数说明:
-
$pattern: 要搜索的模式,字符串形式。
-
$subject: 输入字符串。
-
$matches: 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
-
$flags:flags 可以被设置为以下标记值:
-
PREG_OFFSET_CAPTURE: 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。
-
-
offset: 通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。
返回值
返回 pattern 的匹配次数。 它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后 将会停止搜索。preg_match_all() 不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。
<?php $string = "aasassdASD."; if(preg_match('/^a(as){1,3}[a-zA-Z]+\.$/',$string)) { echo "正确"; } else { echo "错误"; }
12.用正则表达式替换子字符串
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
参数说明:
-
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
-
$replacement: 用于替换的字符串或字符串数组。
-
$subject: 要搜索替换的目标字符串或字符串数组。
-
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
-
$count: 可选,为替换执行的次数。
返回值
如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。
如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。
<?php //删除空格 $string = 'google 123, 456'; $string = preg_replace('/\s+/','',$string); echo $string;
13.用正则表达式分割子字符串
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
通过一个正则表达式分隔给定字符串。
参数说明:
-
$pattern: 用于搜索的模式,字符串形式。
-
$subject: 输入字符串。
-
$limit: 可选,如果指定,将限制分隔得到的子串最多只有limit个,返回的最后一个 子串将包含所有剩余部分。limit值为-1, 0或null时都代表"不限制", 作为php的标准,你可以使用null跳过对flags的设置。
-
$flags: 可选,可以是任何下面标记的组合(以位或运算 | 组合):
-
PREG_SPLIT_NO_EMPTY: 如果这个标记被设置, preg_split() 将进返回分隔后的非空部分。
-
PREG_SPLIT_DELIM_CAPTURE: 如果这个标记设置了,用于分隔的模式中的括号表达式将被捕获并返回。
-
PREG_SPLIT_OFFSET_CAPTURE: 如果这个标记被设置, 对于每一个出现的匹配返回时将会附加字符串偏移量. 注意:这将会改变返回数组中的每一个元素, 使其每个元素成为一个由第0 个元素为分隔后的子串,第1个元素为该子串在subject 中的偏移量组成的数组。
-
返回值
返回一个使用 pattern 边界分隔 subject 后得到的子串组成的数组。
//获取搜索字符串的部分 <?php //使用逗号或空格(包含" ", \r, \t, \n, \f)分隔短语 $keywords = preg_split("/[\s,]+/", "hypertext language, programming"); print_r($keywords); ?>
//将一个字符串分隔为组成它的字符 <?php $str = 'runoob'; $chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY); print_r($chars); ?>
//分隔一个字符串并获取每部分的偏移量 <?php $str = 'hypertext language programming'; $chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE); print_r($chars); ?>