1、正则表达式简介
用来实现字符串的匹配、查找、替换及分割操作
preg_为前缀命名的正则表达式效率较高,
2、正则表达式的语法规则
正则表达式描述了一种字符串匹配的模式,对字符串进行匹配、查找、替换及分割操作。由
- 原子(普通字符)
- 有特殊功能的字符(元字符)
- 模式修正符
组成
preg_match(匹配规则,匹配内容)
3、定界符
通常习惯将模式表达式包含在两个斜线之间“/”,当然也可以是!,|,{ },\等
4、原子
正则表达式最基本的单位,每个模式中字少要包含一个原子。
原子是由所有那些未显式指定为元字符的打印和非打印字符组成的,可以划分为5类
1、普通字符作为原子
普通字符最常见的原子,包括所有的大写和小写字母字符,所有数字等。
如:a-z,A-Z,0-9
<?php
//匹配是否有5这个字符出现
'/5/';
//匹配是否有php这个字符出现
'/php/';
?>
2、一些特殊字符和元字符作为原子
由于任何字符都可以作为原子使用,遇到有特殊意义的符号则需要转义,即使用斜杠“\”转义。将其作为一个普通的原子(即转变成了一个普通字符去做原子)
<?php
//匹配是否有英文的.出现
'/\./';
//匹配是否有<br/>这几个字符出现
'/\<br\/\>/';
?>
3、一些非打印字符作为原子
是一些在字符串中的格式控制符号,例如空格、回车及制表符等。
<?php
//windows中匹配是否具有换行
'/\n/';
//linux中匹配是否具有换行
'/\r\n/';
?>
4、使用“通用字符类型”作为原子
使用一个原子匹配一类字符。如匹配所有字符,匹配所有字母等
如两则email的正则表达式
<?php
//使用普通字符作为原子表示email
'/^[0-9a-ZA-A]+@[0-9a-ZA-Z]+(\.[0-9a-ZA-Z_])+){0,3}$/';
//使用通用字符作为原子表示email
'/^\w+@\w+(\.\w+){0,3}$/'
?>
5、自定义原子表【】作为原子
由于类原子在现实生活中不能穷尽,所以通过【】定义一组彼此地位平等的原子,并且从原子表中仅选择一个原子进行匹配。如
//匹配包含apj3个字母任意一个的sp,即asp,psp,jsp
'/[apj]sp/';
//使用^进行排除,下面可以是xsp,ysp就是不能为asp,psp,jsp
'/^[apj]sp/'
?>
使用负号-连接一组按ascii码顺序排列的原子,能够简化书写
<?php
//匹配一个简单的16进制数
'/0[xX]0-9a-fA-F/';
?>
5、元字符
- 正则表达式可以使用各种元字符来搜索匹配
- 用于构建正则表达式的具有特殊意义的字符,如*,+,?等,
- 在一个正则表达式中,元字符不能单独出现,必须是用来修饰原子的。如果要在正则表达式中包含元字符本身,使其失去特殊的含义,则需要使用""进行转义。
- 构造正则表达式的方法和创建数学表达式的方法相似,就是用多种字符与操作符将小的表达式结合在一起创建更大的表达式。
- 正则表达式可以是单个的字符、字符集合、字符范围、字符间的选择,或者所有这些组件的任意组合。元字符是组成正则表达式的最重要部分。
1、限定符
限定符用来指定正则表达式的一个给定原子必须要出现多少次才能满足匹配有*,+,?,{n},{n,},{n,m}
<?php
//\s表示空白原子,可以匹配a和b之间没有空白,有一个或多个空白的情况
'/a\s*b/';
//可以匹配a和b之间有一个或多个数字的情况
'/a\d+b/';
//匹配a和b之间有一个或没有特殊字符的情况
'/a\W>b/';
//匹配a和b之间必须有4个x的字符串
'/ax{4}b/';
//匹配a和b之间至少要有2个x的字符串
'/ax{2,}b/';
//匹配a和b之间至少有2个和最多有4个x的字符串
'/ax{2,4}b/';
?>
2、边界限制
- 用来限定字符串或单词的边界范围,以获得更准确的匹配结果。
- 元字符“^”或“\A”和“$”(或“\Z”)分别指字符串的开始与结束,而"\b"用于描述字符串每个单词的前边界或者后边界,相反,“\B”表示非单词边界。
<?php
//匹配此字符串是否是以字符串“this”开始的
'/^this/';
//匹配此字符串是否是以字符串“test”结束的
'/test$/';
//匹配次字符串是否含有单词“is”,因为在字符串“is”两边都需要有边界
'/\bis\b/';
//查找字符串“is”时,左边不能有边界而右边必须有边界,如“this”匹配成功
'/\Bis\b/';
?>
3、句号
句号.可以匹配目标中的任何一个字符,包括不可打印字符,但不匹配换行符。如果设定了模式修正符“s”,则圆点也会匹配换行符。
<?php
//匹配a和b之间有任意一个字符的字符串
'/a.b/';
?>
4、模式选择符
竖线 | 用来分隔多选一模式,在正则表达式中匹配两个或更多的选择之一
<?php
//匹配任意一个,如linux,apache,mysql
'/linux|apache|mysql/';
?>
5、模式单元()
使用小括号()将多个原子组成大的原子,被当作一个单元独立使用,一个模式单元中的表达式将被优先匹配
<?php
'/(very)*good/';
?>
6、后向引用
略,实际是看不懂
7、模式匹配的优先级
通常相同优先级从左到右进行运算,不同优先级的运算先高后低,各种操作符的匹配顺序优先级如下:
6、正则表达式函数–字符串的匹配与查找
1、preg_match()函数
三个参数,第三个参数可选
第一个参数,正则编写的模式
第二个参数,被搜索的字符串
第三个参数,matches是把搜索的结果存储到matches数组中
<?php
//用来匹配的正则模式
$pattern='/^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/';
//用来匹配的字符
$mystr="网址为http://www.sina.com/index.php的网络地址";
//使用preg_match()函数进行匹配
if (preg_match($pattern, $mystr,$matches)){
echo "搜索到的url为:".$matches[0]."<br>";
echo "搜索到的url为:".$matches[1]."<br>";
echo "搜索到的url为:".$matches[2]."<br>";
}else {
echo '搜索失败';
}
?>
未能成功,但基本基本思路正确
2、preg_match_all()函数
- 与preg_match()类似,不同的事preg_match()在第一次匹配后会停止搜索,而preg_match_all()会一直搜索到指定字符的结尾
四个参数,前三个参数与preg_match()一致,第四个参数可选值为
- PREG_PATTERN_ORDER:默认值,对结果排序,使matches[0]为全部模式匹配的数组,matches[1]为第一个括号中的子模式所匹配的字符串组成的数组。
- PREG_SET_ORDER:
3、preg_grep()函数
匹配数组中的元素,返回与正则表达式匹配的数组单元。
4、字符串处理函数strstr(),strpos()\strrpos()和substr()
7、正则表达式函数–字符串替换
1、preg_replace()函数
preg_replace(正则模式,被搜索字符,替换字符,limt(替换掉的项的数量))
4个参数,第四个可选
第一个参数:正则模式
第二个参数:被搜索字符
第三个参数:替换字符
第四个参数:可选,如果省略或为-1将所有的匹配项都会被替换掉
2、str_replace()函数
这个使用的不是正则
str_replace(目标对象,替换对象,被搜索的字符串,替换的次数)
8、正则表达式函数–字符串的分割和连接
1、pre_split()函数
使用了正则
2、explode()函数
explode(分割字符,被分割的字符串,limit可选)
三个参数,limit可选
第一个参数为:用来充当分隔符的字符
第二个参数为:被分割的字符串
第三个参数为:分割成多少个字符串
3、implode()函数
将数组中的所有元素组合为一个字符串,函数jion()为该函数的别名,语法格式如下
implode(连接字符,被连接的字符数组)
<?php
$mystr=["hello ","world","!"];
echo implode("--", $mystr);
echo "<br>";
echo implode("++", $mystr);
?>