正则表达式简介
- 正则表达式的处理函数
- 表达式应该被包含在定界符中,如反斜杠“/”定界符
正则表达式的语法规则
原子
-
普通字符作为原子
'/5/' #用5来作为原子 '/php/' #用php来作为原子进行匹配
-
一些特殊字符和元符号作为原子:对于一些有特殊意义的字符,需要使用“\”转义字符
-
非打印字符作为原子
- 使用通用字符作为原子
-
自定义原子表
- 在某些情况下,通用字符不能代表所有的匹配类型,因此,就需要我们自定义原子表,使用"[]"来自定义一组类型
- 还可以使用"[^]"来匹配除了表以外的任意字符
- 还可以使用“-”来进行连接一组按照ASCLL码顺序排列的原子,来进行一类匹配
'/[abc]jsp/' #匹配ajsp,bjsp,cjsp '/[^abc]jsp/' #除了ajsp,bjsp,cjsp的其他字符,比如:djsp,ejsp等等 '/[0-9]/' #匹配0-9的数字,相当于\d
有特殊功能的字符
元字符
元字符不能单独出现,必须修饰原子,如果要匹配元字符本身,则要加上“\”进行转义
- 限定符
- 边界限制
- 句号:在字符类之外,模式中的圆点可以匹配目标中的任何一个字符,包括不可打印字符
'a.b' #匹配a和b之间任意有效的字符,比如:acb,axb,arb等等
- 模式选择符:匹配两个或者更多的选择之一
'/a|b/' #匹配a字符或b字符
'/a|b|c/' #匹配a字符或b字符或c字符
- 模式单元:使用“()”进行包括,把包裹中的内容当成一个原子
'/(yes )*good/' #匹配good、yes good、yes yes good等等
- 后向引用:使用“()”包裹起来的表达式,能够存储在缓冲区中,在后面的表达式中可以使用“\\1”、“\\2”、“\\3”来进行引用
- 正则表达式的优先级:从左往右进行计算
模式修正符
- 模式修正符在定界符之外进行使用,可以修正对正则表达式的解释,扩展了正则表达式在匹配、替换等操作时的某些功能
'/php/i' #在匹配时不区分大小写
'/ph p/ix' #忽略空白和不区分大小写
与Perl兼容的正则表达式函数
函数:preg_match()
- 第一个参数:为正则表达式文本
- 第二个参数:要匹配的字符
- 第三个参数:可选参数,用于获得包含了第一参数子模式匹配的各个部分的结果,子模式用“()”进行包裹,matches[0]包含了正则表达式pattern的整体结果,而matches[1]则保存了第一个子模式匹配的结果,以此类推。
- 该函数只匹配一次,并且返回0或1的匹配结果数
<?php
$pattern='/(https?|ftp?):\/\/([^\.]+).(com|org|cn|xyz)/';
$string="我的网址是https://siqulab.cn,四曲博客";
$array=array();
preg_match($pattern,$string,$array);
echo "匹配结果:".$array[0]."<br/>";
echo "协议:".$array[1]."<br/>";
echo "域名:".$array[2].".".$array[3];
// 运行结果:
// 匹配结果:https://siqulab.cn
// 协议:https
// 域名:siqulab.cn
?>
函数:preg_match_all()
- 该函数与preg_match()的用法一致,不同的是,它不止匹配一次,而是匹配到文本底部
- 第四个参数有两个预定义的值:
- PREG_PATTERN_ORDER:默认参数,对结果使用matches[0]全部模式匹配的数组,对matches[1]第一个子匹配的数组
- PREG_SET_ORDER:matches[0]为第一组结果,matches[1]为第二组结果,以此类推
<?php
$pattern='/(https?|ftp?):\/\/([^\.\/]+).(com|org|cn|xyz|work)/';
$string="我的网址是https://siqulab.cn,四曲博客:https://hecloud.work";
#开始匹配
preg_match_all($pattern, $string, $array,PREG_SET_ORDER);
#输出结果
for($i=0;$i<count($array);$i++){ #匹配到两个结果,因此循环两次
echo "第".$i."个网址为:".$array[$i][0]."<br/>";
echo "协议:".$array[$i][1]."<br/>";
echo "域名:".$array[$i][2].".".$array[$i][3];
echo "<br/><br/>";
}
// 运行结果:
// 第0个网址为:https://siqulab.cn
// 协议:https
// 域名:siqulab.cn
// 第1个网址为:https://hecloud.work
// 协议:https
// 域名:hecloud.work
?>
函数:preg_grep()
- 第一个参数,要匹配的模式,也就是正则表达式
- 第二个参数为输入数组,对输入数组当中的每个元素,只进行一次匹配
字符处理函数
- strstr()或者strpos()函数,查找某个字符串中是否包含某个字符串
- substr()函数,搜索一个字符串在另一个字符串当中的第一次出现,该函数返回字符串的其余部分,如未找到,则返回false,第一个参数是提供被搜索的字符串,第二个参数为所搜索的字符串
- strpos(),返回字符串在另一个字符串中第一次出现的位置,如果没有找到,则返回false
字符串的替换
- preg_replace()
该函数会在第三个参数subject中搜索第一个参数所匹配的匹配项,并用第二个参数当中的内容进行替换,第四个参数是可选参数,则仅替换limit个匹配,如果省略或其数值为-1,则所有的匹配项都会被替换
该函数的逆向引用,最好不要采用“\\n”的形式,最好采用\${n}的形式进行逆向引用
<?php
$pattern='/([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})/';
$string="你好12/3/2012,这是一个日期";
echo preg_replace($pattern,"\${3}-\${1}-\${2}",$string); //使用\${n}的方式进行向后引用
// 运行结果:
// 你好2012-12-3,这是一个日期
?>
- str_replace()
- 第一个参数为目标对象
- 第二个参数为替换对象
- 第三个参数subject则是被处理的对象
- 第四个参数可选,表示被替换的次数
- 该函数返回被替换的字符串
- 第一个字符串和第二个字符串都可以为数组
<?php
$array=array("a","b","c");
echo str_replace($array,"", "abcd"); #用第一个参数中的每个元素对第三个参数进行匹配
#将第三个参数中含有a、b、c三个字符的位置替换为空
// 输出结果:
// d
?>
- 如果第一个和第二个都是字符串,则会进行对应位置的替换
<?php
$array=array("a","b","c");
$array_1=array("d","e","f");
echo str_replace($array,$array_1, "abcd"); #用第一个参数中的每个元素对第三个参数进行匹配
// 运行结果:
// defd
?>
字符串的分割和链接
- 函数preg_split()
- 如果指定了limit参数,则至多返回limit个子字符串
- 第四个参数:
<?php
var_dump(preg_split("/[\s,]+/", "hello,siqu"));
echo "<br/>";
#使用偏移量,偏移量即为输出结果第一字符在原字符的位置
$array=preg_split("/[\s,]+/", "hello,siqu",-1,PREG_SPLIT_OFFSET_CAPTURE);
#打印结果
for ($i=0;$i<count($array);$i++){
echo "结果为:".$array[$i][0]."<br/>";
echo "偏移量:".$array[$i][1]."<br/>";
}
// 运行结果:
// array(2) { [0]=> string(5) "hello" [1]=> string(4) "siqu" }
// 结果为:hello
// 偏移量:0
// 结果为:siqu
// 偏移量:6
?>
- 函数explode()
- 第一个参数为分割字符
- 第二个参数要分割的字符串
- 第三个参数可选,表示要返回多少个子串
- 成功返回字符串,否则返回false
<?php
$array=explode(",", "hello,siqu");
var_dump($array);
// 运行结果:
// array(2) { [0]=> string(5) "hello" [1]=> string(4) "siqu" }
?>
- 函数implode()
- 该函数用于将数组pieces中的每个元素使用glue链接起来,并且组合成一个字符串
<?php
$array=array("yes","no");
echo implode("+", $array);
// 运行结果:
// yes+no
?>
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容