PHP中的正则函数
1、?表示一个不确定的字符,*表示任意多个不确定字符(可能是0次),+匹配重复一次或更多次
2、正则表达式组成:分隔符、表达式和修饰符
3、元字符是正则表达式中具有特殊意义的专用字符,用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
4、\w匹配字母或数字或下划线或汉字;\s匹配任意空白符;\d匹配数字;\b匹配单词的开始或结束;^匹配字符串的开始;$匹配字符串的结束;-表示范围;[]匹配括号中的任意一个字符
\b匹配位置的精确说法:前一个字符和后一个字符不全是(一个是,一个不是或不存在)“\w”
5、量词
*:重复0次或更多次
+:重复1次或更多次
?:重复0次或1次
{n}:重复n次
{n,}:重复n次或更多次
{n,m}:重复n到m次
6、字符组:[]匹配单个字符
7、转义:\ 查找或匹配元字符本身
8、不是所有出现特殊字符的地方都要转义
例如,c[aou?*)]t可以匹配"cat"、"c?t"、"c)t"等字符。其中?和*等特殊字符都不需要转义,因为字符组里匹配的是单个字符,这些特殊字符不会引起歧义
9、反义:比如匹配除了数字以外其他任意字符
\W
\S 匹配任意不是空白符的字符
\D
\B
[^x]
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
10、分支:(c | h | f | to)at
11、分组:
捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?
注释
(?#comment)
IP地址匹配
(2[0-4]\d | 25[0-5] | [01]?\d\d?\.){3}(2[0-4]\d | 25[0-5] | [01]? \d\d?)
指定子表达式的组名
?
组号匹配需要从左到右扫描两遍:第一遍只给未命名组分配,第二遍只给命名组分配
12、反向引用
使用命名捕获分组 (?P"|').*?(?P=quote)
例如要捕获字符串“\"This is a 'string'\"”引号内的字符
错误方式: (\" | ').*?(\" | ')
正确方式:(" | \').*? \1
13、环视:断言用来声明一个应该为真的事实。正则表达式中,只有当断言为真时才会继续进行匹配。断言匹配的是一个事实,而不是内容
断言用于查找在某些内容(但并不包括这些内容)之前或之后,也就是一个位置(如\b、^、$)应该满足的一定条件
顺序肯定环视(?=exp) 零宽度正预测先行断言,断言自身出现位置的后面能匹配表达式exp
匹配以ing结尾的单词前面部分 \b\w+(?=ing\b)
逆序肯定环视 (?<=exp) 零宽度正回顾后发断言,断言自身出现位置的前面能匹配表达式exp
匹配以re开头的单词的后半部分 (?<=\bre)\w+\b
顺序否定环视 (?!exp) 零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp
匹配3位数字,而且这3位数字的后面不能是数字 \d{3}(?!\d)
匹配不包含连续字符串abc的单词 \b((?!abc)\w) + \b
逆序否定环视 (?
匹配不包含属性的简单HTML标签内的内容 (?<=<(\w+)>).*(?=<\/\1>)
14、贪婪、懒惰匹配模式
加?将贪婪匹配转为懒惰匹配
懒惰匹配模式:在匹配和不匹配都可以的情况下,优先不匹配,记录备选状态,并将匹配控制交给正则表达式的下一个匹配字符。当后面的匹配失败时,回溯,进行匹配
php $str = '[url]1.gif[/url][url]2.gif[/url][url]3.gif[/url]'; $s = preg_replace("#\[url\](?\d\.gif)\[\/url\]#", "", $str); var_dump($s); ?> php echo '
'; $str = '[url]1.gif[/url][url]2.gif[/url][url]3.gif[/url]'; $s = preg_replace("#\[url\](.*?)\[\/url\]#", "", $str); var_dump($s); ?> php echo '
'; $str = '[url]1.gif[/url][url]2.gif[/url][url]3.gif[/url]'; $s = preg_replace("#\[url\](.*)\[\/url\]#", "", $str); var_dump($s); ?>
15、构造正则表达式
正则表达式的逻辑关系:与、或、非
与关系:连续出现的字符
或关系:代表元素可以出现,也可以不出现,或者出现的次数不确定,可以用量词来表示或关系 ? + 字符组 分支结构
非关系:反义 和 ^字符
php $reg = "#]*>(.*)<\/a>#"; $str = 'baidusomesohu'; preg_match_all($reg, $str, $m); var_dump($m); ?> php echo '
'; $reg = "#]*>([^<>]*)<\/a>#"; $str = 'baidusomesohu'; preg_match_all($reg, $str, $m); var_dump($m); ?>
//array(2) { [0]=> array(1) { [0]=> string(78) "baidusomesohu" } [1]=> array(1) { [0]=> string(45) "baidusomesohu" } }
array(2) { [0]=> array(2) { [0]=> string(38) "baidu" [1]=> string(36) "sohu" } [1]=> array(2) { [0]=> string(5) "baidu" [1]=> string(4) "sohu" } }
16、运算符优先级
转义符号 > () [] > 限定符 > 定位点和序列 > |
17、正则表达式的常用模式
忽略大小写模式i:对整个表达式而言%i 若仅对后面字符起作用前加(?i)
多行模式m:
点号通配模式s:
懒惰模式U:
结尾限制D:限定不可以有换行,单独的$可以有换行
支持UTF-8转义表达u:
18、实战