首页 > 其他 > 详细

正则表达式

时间:2020-06-24 11:42:36      阅读:58      评论:0      收藏:0      [点我收藏+]

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,并捕获文本到自动命名的组里

(?<name>exp)  匹配exp,并捕获文本到名称为name的组里

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

 

指定子表达式的组名

?<Word>\w+

 

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

12、反向引用

使用命名捕获分组  (?P<quote>"|‘).*?(?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

 

逆序否定环视 (?<!exp)  零宽度负回顾后发断言,可以用(?!exp)断言此位置的前面不能匹配表达式exp

                匹配不包含属性的简单HTML标签内的内容  (?<=<(\w+)>).*(?=<\/\1>)

 

14、贪婪、懒惰匹配模式

加?将贪婪匹配转为懒惰匹配

懒惰匹配模式:在匹配和不匹配都可以的情况下,优先不匹配,记录备选状态,并将匹配控制交给正则表达式的下一个匹配字符。当后面的匹配失败时,回溯,进行匹配

<?php
    $str = ‘[url]1.gif[/url][url]2.gif[/url][url]3.gif[/url]‘;
    $s = preg_replace("#\[url\](?<WORD>\d\.gif)\[\/url\]#",
        "<img src = http://image.ai.com/upload/$1>", $str);
    var_dump($s);
?>

<?php
    echo ‘<br>‘;
    $str = ‘[url]1.gif[/url][url]2.gif[/url][url]3.gif[/url]‘;
    $s = preg_replace("#\[url\](.*?)\[\/url\]#",
    "<img src = http://image.ai.com/upload/$1>", $str);
    var_dump($s);
?>

<?php
echo ‘<br>‘;
$str = ‘[url]1.gif[/url][url]2.gif[/url][url]3.gif[/url]‘;
$s = preg_replace("#\[url\](.*)\[\/url\]#",
    "<img src = http://image.ai.com/upload/$1>", $str);
var_dump($s);
?>

 

技术分享图片

 

 

15、构造正则表达式

正则表达式的逻辑关系:与、或、非

与关系:连续出现的字符

或关系:代表元素可以出现,也可以不出现,或者出现的次数不确定,可以用量词来表示或关系  ?  +  字符组  分支结构

非关系:反义 和 ^字符

<?php
$reg = "#<a[^>]*>(.*)<\/a>#";
$str = ‘<a href = "http://baidu.com">baidu</a>some<a href = "http://sohu.com">sohu</a>‘;
preg_match_all($reg, $str, $m);
var_dump($m);
?>

<?php
echo ‘<br>‘;
$reg = "#<a[^>]*>([^<>]*)<\/a>#";
$str = ‘<a href = "http://baidu.com">baidu</a>some<a href = "http://sohu.com">sohu</a>‘;
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、实战

正则表达式

原文:https://www.cnblogs.com/liushoudong/p/13175820.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!