php正则表达式基本
一.正则表达式的组成 1.分隔符,可以是除了字母,数字,反斜线及空白以外的任何字符,比如/,!,#,%,|,~等;通常有/,!,~ 2.表达式:由一些特殊字符和非特殊字符组成. 3.修饰符:用于开启或关闭某种功能/模式 二.元字符 常用的元字符有以下几种 . 匹配除换行符外任何字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意空白字符 \d 匹配数字 \b 匹配单词开始或结束 ^ 匹配字符串开始 $ 匹配字符串结束 - 表示范围 [] 匹配括号中任意一个字符 * + ? 量词 三.字符组 如果匹配没有预定义的元字符,可以使用字符组;只需要在[]内列出他们; 如 [aoeiou]匹配任何一个英文元音字母; [.?!] 匹配标点符号 . ? ! ps:尽管[]号内有好多字符,但他只匹配单个字符 四.转义 如果要匹配元字符本身,比如?,直接匹配,会被当成元字符处理,这时候要使用转义; \? 如: \? 就可匹配字符串中含有?的字符串 ps:字符组中的元字符不需要转义 五.反义 \W 匹配除字母或数字或下划线或汉字以外 \S 匹配除任意空白字符以外 \D 匹配除数字以外 \B 匹配不是单词开始或结束的位置 字符组的反义是加^ [^abc] 匹配除了abc这几个字母以外的任意字符 ps:反义的特征是和一些已知元字符相反,并且为大写形式.字符组例外 六.分支 | 表示分支 分支就是存在多种可能的匹配情况;如要匹配cat,hat,fat,toat,就可以用分支形式 (c|h|f|to)at ps:匹配分支条件时,从左到右测试每个条件,如果满足某个分支,就不再考虑其他条件. 七.分组 重复单个字符需要限定符即可做到,重复多个字符就需要分组;分组用小括号指定表达式,然后规定这个表达式重复的次数. 1.捕获 (exp) 匹配exp,并捕获文本到自动命名组里 (?<name>exp) 匹配exp,并捕获文本到name组里 (?:exp) 匹配exp,不捕获,也不分配组号 示例1: <?php $str = 'cat'; preg_match_all('/(c).*/', $str, $arr); var_dump($arr); 输出(自动命名组): array(2) { [0]=> array(1) { [0]=> string(3) "cat" } [1]=> array(1) { [0]=> string(1) "c" } } 示例2: <?php $str = 'cat'; preg_match_all('/(?<name>c).*/', $str, $arr); var_dump($arr); 输出(多出一个test组): array(3) { [0]=> array(1) { [0]=> string(3) "cat" } ["test"]=> array(1) { [0]=> string(1) "c" } [1]=> array(1) { [0]=> string(1) "c" } } 示例3: <?php $str = 'cat'; preg_match_all('/(?:c).*/', $str, $arr); var_dump($arr); 输出: array(1) { [0]=> array(1) { [0]=> string(3) "cat" } } 2.零宽断言(匹配的是事实,不是内容) (?=exp) 匹配exp前面的位置 (?<=exp) 匹配exp后面的位置 (?!exp) 匹配后面跟的不是exp的位置 (?<!exp) 匹配前面跟的不是exp的位置 如: <?php $str = 'testecattest'; preg_match_all('/(?=te)/', $str, $arr); 则输出: array(1) { [0]=> array(3) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" } } 匹配到三处 ps:默认情况下,每个分组拥有一个组号,规则是从左到右,以分组的左括号为标志,第一个出现在分组里的为1,第二个为2,以此类推;分组0为整个表达式. 八.反向引用 反向引用在于重复搜索前面某个分组匹配的文本. 示例: $str = '[url]1.gif[/url]'; $img = preg_replace('/\[url\](\d+\.gif)\[\/url\]/', '<img src="$1" />', $str); echo $img; 输出 <img src="1.gif" /> $1匹配了分组(\d+\.gif) 九.环视(零宽断言) 1.顺序肯定环视(?=exp) 断言自身出现位置的后面能匹配表达式exp 示例: <?php $str = 'what are you doing testing?'; preg_match_all('/\b\w+(?=ing\b)/', $str, $arr); var_dump($arr); 匹配do和test 2.逆序肯定环视(?<=exp) 断言自身出现位置的前面能匹配表达式exp 示例: <?php $str = 'what are you doing testing?'; preg_match_all('/\b(?=ing)/', $str, $arr); var_dump($arr); 匹配doing和testing 3.顺序否定环视(?!exp) 4.逆序否定环视(<!exp) 十.常用修饰符/模式 1. i 忽略大小写 示例: <?php $str = 'cat test CAT'; preg_match_all('/cat/i', $str, $arr); var_dump($arr); 不加i修饰符,只匹配cat 2. m 多行模式 仅当表达式中出现^,$至少一个元字符且有换行符\n时,m修饰符才起作用; 如: $str = 'cat test cat'; 要提取cat a.不用多行模式 preg_match_all('/cat.*/', $str, $arr); b.用多行模式 preg_match_all('/cat.*$/m', $str, $arr); 3.s 点号统配模式(.号可以匹配换行符) 如: <?php $str = 'cat t test cat f'; preg_match_all('/t.*f/s', $str, $arr); var_dump($arr); 输出: array(1) { [0]=> array(1) { [0]=> string(19) "t t test cat f" } } 4.U 懒惰模式 等效于懒惰匹配 5.D 结尾限制 等效于结尾限定符 6.u 启用pcre中与perl不兼容的功能,模式字符串被当成utf-8