正则表达式

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,并捕获文本到名称为name的组里

(?: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?)

 

指定子表达式的组名

?\w+

 

组号匹配需要从左到右扫描两遍:第一遍只给未命名组分配,第二遍只给命名组分配

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); ?>

 

正则表达式_第1张图片

 

 

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、实战

你可能感兴趣的:(正则表达式)