第六章:正则表达式
1:行定位符( ^ 和 $ )—— 表示行得开始和结尾
2:单词定界符(\b、\B)—— 如:使用tm可以匹配在字符串中出现的任何位置,那么类型html、utmost中的tm也会被查找出来。但现在需要匹配的单词是tm,而不是单词的一部分。此时可以使用单词分界符 \b,表示要操作的字串为一个完整的单词。如:
\btm\b
还有一个大写的\B,意思和\b 相反。它匹配的字串不能是一个完整的单词,而是其他单词或字串的一部分:\Btm\B
3:字符类([])—— 正则表达式是区分大小写的,如要忽略大小写可以使用方括号表达式“[]”。只要匹配的字符出现在方括号内,即可表示匹配成功。注意:一个方括号只能匹配一个字符
4:选择字符(|)—— 该字符理解成“或”。使用[]和使用 | 的区别在于前者只能匹配单个字符。
5:连字符(-)—— [a,b,c,d.....A,B,C,D...] => [a-zA-Z]
6:排除字符([^])
7:限定符(?、 *、 +、 {n,m})
8:点字符(.)—— 匹配除换行符外任何一个字符
9:转义字符(\)—— [0-9]{1,3}(\.[0-9]{1,3}){3}
10:反斜线(\)
11:括号字符( () )—— a:改变限定符的作用范围: (thir|four)th b:分组
12:反向引用——依靠子表达式的“记忆”功能来匹配连续出现的字串字母。如匹配连续两个it,首先将单词it作为分组,然后再后面加上“\1”即可: (it)\1
这是反向引用最简单的格式。如果要匹配的字串不固定,那么就将括号内的字串写成一个正则表达式。如果使用了分组,可以用“\1”、“\2” 来表示每个分组(顺序是从左到右)。如:
([a-z])([A-Z])\1\2
除了可以使用数字来表示分组,还可以自己指定分组名称:
(?P<subname>...)
如果要反向引用该分组,使用如下语法:
(?P=subname)
13:模式修饰符—— 作用:设定模式。也就是规定正则表达式应该如何解释和应用。PHP中的主要模式如下:
POSIX 扩展正则表达式函数——php中实现POSIX正则表达式的函数有7个
1:ereg() 函数和 eregi() 函数
语法: bool ereg/eregi (string pattern, string string [,array regs]);
功能:在字符串string中匹配表达式pattern,成功返回true,否则false。如果有第三个参数regs,则将成功匹配的字串按子串(子表达式)划分,并储存到regs数组中。 ereg区分大小写, eregi不区分。
使用ereg()函数验证变量是否合法:
$ereg = '^[$][[:alpha:]__][[:alnum:]]*';
$ereg($ereg, '$_name', $register); //使用ereg()函数匹配变量名
var_dump($register);
2:ereg_replace() 函数和 eregi_replace() 函数
语法: string ereg_replace/eregi_replace ( string pattern, string replacement, string string);
功能:在字符串string中匹配表达式pattern,如果成功,则使用replacement来替换匹配字串,并返回替换后的string。
3:split()函数 和 spliti() 函数—— 使用表达式pattern 来分割字符串string
array split/spliti (string pattern, string string [,int limit]);
PCRE兼容正则表达式函数——实现PCRE风格的正则表达式的函数也有7个。PCRE函数效率优于POSIX函数
1:preg_grep() 函数
语法:array preg_grep (string pattern, array input)
功能:使用数组input中的元素一一匹配表达式pattern,最后返回所有相匹配的元素所组成的数组
$preg = '/\d{3,4}-?\d{7,8}/'; //国内电话格式表达式
$arr = array('043212345678','0431-7654321','12345678') // 包含元素的数组
$preg_arr = preg_grep($preg, $arr);
var_dump($preg_arr);
2:preg_match()函数和preg_match_all() 函数
语法:int preg_match/preg_match_all (string pattern, string subject [,array matches]);
功能:在字符串subject中匹配表达式pattern,函数返回匹配的次数。如果有数组matches,那么每次匹配的结果都将被储存到数组matches中。
preg_match() 的返回值是0或1,因为匹配成功后就停止继续查找了。而preg_match_all() 则会一直匹配直到最后
3:preg_quote() 函数
语法:string preg_quote (string str [,string delimiter]);
功能:该函数将字符串str中的所有特殊字符进行自动转义,如果有参数delimiter,则该参数所包含的字串也将被转义。函数返回转义后的字串。
注意:这里的特殊字符是指正则表达式中具有一定意义的元字符。其他如“@”、“#”等则不会被当做特殊字符处理
4:preg_replace() 函数
语法:mixed preg_replace( mixed pattern, mixed replacement, mixed subject [, int limit]);
功能:该函数在字符串subject中匹配表达式pattern,并将匹配项替换成字串replacement。如果有limit,则替换limit次。
注意:如果参数中调用的是数组,有可能在调用过程中并不是按照数组的key值进行替换,所以在调用之前需要将数组重新排列ksort()
$string = '[b]粗体字[/b]';
$b_rst = preg_replace('/\[b\](.*)\[\/b\]/i', '<b>$1</b>', $string);
echo $b_rst;
说明:preg_replace() 函数中的字串“$1” 是在正则表达式外调用分组,按照$1、$2排列,依次表示从左到右的分组顺序,也就是括号顺序。 $0 表示的是整个正则表达式的匹配值。参考 反向引用。
5:preg_replace_callback() 函数
语法: mixed preg_replace_callback() 函数与 preg_replace() 函数的功能相同,都用于查找和替换字串。不同的是它使用一个回调函数来代替replacement参数
6:preg_split() 函数
语法: array preg_split( string pattern, string subject [, int limit])
功能:使用表达式pattern来分割字符串subject。如果有参数limit,那么数组最多有limit个元素