PHP正则表达式

"本文深入探讨了正则表达式的语法规则,包括元字符如d、D、s、S等,并展示了如何使用模式修正符如i、m、s、U来调整匹配行为。此外,还详细讲解了与正则表达式配合的PHP函数preg_match_all和preg_replace的用法,以及它们在字符串操作中的实际应用。"
摘要由CSDN通过智能技术生成

目录

一、正则表达式语法规则

二、元字符

三、模式修正符

 四、与正则表达式配合的函数


一、正则表达式语法规则

正则表达式描述了一类字符串的特征,然后通过这个特征可以配合一些特定的函数,来完成对字符串更加复杂的一系列操作(对其他字符串进行匹配、查找、替换及分割操作)。

正则表达式的特征

>>是由一个或多个(1)普通字符(比如a-z)   2、元字符(有特殊功能的字符,比如:*、+、?)等组成的字符串

>>'/a/',a就是普通字符,/是定界符(表达表达式的开始和结束)

二、元字符

\d匹配任意一个十进制数字,等价于[0-9]
\D匹配任意一个除十进制数字以外的字符,等价于[^0-9]
\s匹配任意一个空白字符,比如换页符、换行符、回车符、制表符、垂直制表符
\S匹配除空白字符以外的任意一个字符
\w匹配任意一个数字、字母或下划线
.匹配除换行符以外的任意一个字符
*

匹配0次、或1次、或多次其前面的字符

+

匹配一次或多次其前面的字符

匹配0次或1次其前面的字符

{n}表示其前面的字符恰好出现n次
{n,}表示其前面的字符出现不少于n次
{n,m}

表示其前面的字符至少出现n次,最多出现m次

^或\A匹配字符串开始的位置
$或\Z匹配字符串结束的位置
|匹配两个或则多个模式
[ ]匹配方括号中的任意一个字符
[ ^ ]匹配除方括号中字符以外的任意一个字符
()将括号中作为一个整体以便将其中的内容获取到
\W匹配除数字、字母或下划线以外的任意一个字符

1、\d 和\D

<?php
/**
 * 元字符: \d
 *        匹配除0、1、2、3、4、5、6、7、8、9之外的任意一个字符
 *         \D
 *        匹配除了0,1,2,3,4,5,6,7,8,9之外的任意一个字符
 */
$pattern='/t\dst/';
$str="abct1sts";
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

2、   .   匹配除换行符以外的任意一个字符

<?php
/**
 * 元字符:  .
 *        匹配除换行符以外的任意一个字符,如果只想匹配一个普通的,在正则表达式中使用\进行转义
 */
$pattern='/t.st/';
$str="abct.sts";
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

3、|  :匹配两个或则多个模式

<?php
/*       |
 */
$pattern='/test|abc|AAA/';
$str="efewtestfwfaAAAwe";
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

4、[]方括号中的任意一个字符,[^e]匹配除方括号中的任意一个字符

<?php
/**
 * []方括号中的任意一个字符
 * [^e]匹配除方括号中的任意一个字符
 */
$pattern='/t[abcde]st/';
$str="adwdwqdqwtest       tdqwst  test  tfaufuhshst";
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

5、+和*

<?php
 /**
  *    元字符:+    匹配一次或多次其前面的字符
             *  匹配0次、或1次、或多次出现
 */
$pattern='/te+st/';   
$str='abctst';//+代表前面的那个字符出现一次或多次,但不能不出现
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
 ?>

6、^或\A     匹配字符串的开始位置

<?php
/*    
 ^或\A     匹配字符串的开始位置
 */
$pattern='/^test/';
$str="testabc";
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

7、^与$配合使用

<?php
/*    
  ^与$配合使用
 */
$pattern='/^te.*st$/';
$str="tehbfakfkjsnsdnkst";
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

 8、.与{n}配合

<?php
  /* .与{n}配合 */
$pattern='/t.{3}st/';    //t...st
$str='abctabcst';
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
 ?>

9、 .与*配合

<?php
 /**
  *    .与*配合
  */
$pattern='/t.*st/';    //tst
$str='abctst';
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
 ?>

三、模式修正符

在正则表达式定界符之后使用,可以调整正则表达式的解释。

i在和模式进行匹不去风大小写配时
m多行匹配,如果目标字符串中没有"\n"字符,或则模式中没有出现^或$,设置这个修饰符不产生任何影响
s匹配所有的字符包括换行符
U禁止贪婪匹配

(1)      i

<?php
/**
 * 模式修正符:i
 * 在和模式进行匹配时不区分大小写
 */
$pattern ='/test/i';
$str='     test    TEST     Test    TeSt';
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

(2)        m

<?php
/**模式修正符m
 多行匹配:如果目标字符串中没有“\n”字符,或则模式中没有出现^或$,设置这个修饰符不产生任何影响
 使用条件:1)目标字符串中必须包含“\n”     2)正则表达式中必须要出现^或$
  */
$pattern='/test\r$/m';
//str="test\r\ntest\r\ntest\r\ntest\r\ntest";
/*
$str="test
test
test
test";
//在windows操作系统中,看见的换行(现象)其实是通过\r\n完成
//在linux操作系统中,看见的换行(现象)就是通过\n完成
 */
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

(3)          s

<?php
/*
模式修正符S:匹配所有字符,包括\n
*/
$pattern='/t.st/s';
$str="t\nst";
/*    $str="t
st;//其实在windows里等价于$str="t\r\nst"
 */
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

(4)          U

<?php
/**
 * 模式匹配符:U 
 * 禁止贪婪匹配
 */
$pattern='/a.*f/U';//等价于$pattern='a.*?f/';
$str='        adwqdwqdwqwf    asshdvbhf';
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);

//模式修正符可以多个搭配使用
$pattern='/a.*f/iU';
$str='            Adwqdwqdwqdwqwf    aveegregregef';
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);
?>

 四、与正则表达式配合的函数

(1)preg_match()

<?php
/**
 * preg_match()
 * 执行一个正则表达式匹配
 * 参数说明:
 *       第一个参数:正则表达式
 *       第二个参数:目标字符串
 *       第三个参数:放一个变量,执行完成后,里面会有匹配到的部份
 *       第四个参数:可以传PREG_OFFSET_CAPTURE进入(那么第三个参数那个变量里面的数据就会有匹配到的部分的偏移值),默认传的是0
 *       第五个参数:可以传一个值,来表示从目标字符串的那个位置开始搜索(单位是字节)
 */
$pattern='/t(.*?)st/';
$str='adwdwqdqwtest       tdqwst  test  tfaufuhshst';
var_dump(preg_match($pattern,$str,$arr));
var_dump($arr);
if(preg_match($pattern,$str,$arr,PREG_OFFSET_CAPTURE)){
    echo '找到了'.'<\br>';
}else{
    echo '没找到';
}
?>

(2)preg_match_all()

<?php
/**
 * preg_match_all()
 *       第四个参数(可选):
 *           PREG_PATTERN_ORDER
 *           PREG_SET_ORDER
 *           PREG_OFFSET_CAPTURE
 *       第五个参数:可以传一个值,来表示从目标字符串的那个位置开始搜索(单位是字节)
 */
$pattern='/t(.*?)a(s)t/';
$str='adwdwqdqwtest       tdqwst  test  tfaufuhshst';
var_dump(preg_match($pattern,$str,$arr,PREG_OFFSET_CAPTURE));
var_dump($arr);
?>

(3) preg_replace()

<?php
/**
 * preg_replace第一个参数和第二个参数传数组,一一对应对应去替换!
 */
$pattern=array('/<div(.*?)>(.*?)<\/div>/',
            '/<p(.*?)>(.*?)<\/p>/'      
);
$str1=array(
    '<a$1 href="http://sifangku.com">$2</a>',
    '<span$1>我是span标签啦!$2</span>'
);
$str='dwqdwq<div style="color:red;font-size:25px;">开发而离开南非</div>feauiehru<div>我是后面的div</div>';
if(preg_match($pattern,$str,$arr)){
    echo '替换后的'.preg_replace($pattern,$str1,$str,1,$count);
    echo count;
}else{
    echo '对不起,没有找到!';
}
echo '<br /><br /><br /><br />';
echo '原来的字符串:'.$str;
?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sss@syt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值