位置: 编程技术 - 正文

php正则表达式基本知识与应用详解【经典教程】(php 正则)

编辑:rootadmin

推荐整理分享php正则表达式基本知识与应用详解【经典教程】(php 正则),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php正则表达式语法,php正则表达式验证密码,php正则表达式验证密码,php正则匹配a标签href,php 正则表达式,php 正则表达式,php 正则,php 正则表达式,内容如对您有帮助,希望把文章链接给更多的朋友!

本文实例讲述了php正则表达式基本知识与应用。分享给大家供大家参考,具体如下:

概述

正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配、替换、截取匹配的字符串。常用的语言基本上都有正则表达式,如JavaScript、Java等。其实,只有了解一种语言的正则使用,其他语言的正则使用起来,就相对简单些。文本主要围绕解决下面问题展开。

① 有哪些常用的转义字符② 什么是限定符与定位符③ 什么是单词定位符④ 特殊字符有哪些⑤ 什么是逆向引用以及怎样使用逆向引用⑥ 匹配模式⑦ php中怎样使用正则表达式⑧ php中哪些方面需要用到正则⑨ 怎样进行邮箱匹配,url匹配,手机匹配⑩ 怎样使用正则替换字符串中某些字符&#; 贪婪匹配与惰性匹配区别&#; 正则表达式之回溯与固态分组&#; 正则优缺点有哪些

正则表达式的基本知识汇总

行定位符(^与$)

行定位符是用来描述字符串的边界。“$”表示行结尾“^”表示行开始如"^de",表示以de开头的字符串 "de$",表示以de结尾的字符串。

单词定界符

我们在查找的一个单词的时候,如an是否在一个字符串”gril and body”中存在,很明显如果匹配的话,an肯定是可以匹配字符串“gril and body”匹配到,怎样才能让其匹配单词,而不是单词的一部分呢?这时候,我们可以是哟个单词定界符b。

banb 去匹配”gril and body”的话,就会提示匹配不到。

当然还有一个大写的B,它的意思,和b正好相反,它匹配的字符串不能使一个完整的单词,而是其他单词或字符串中的一部分。如BanB。

选择字符(|) ,表示或

选择字符表示或的意思。如Aa|aA,表示Aa或者是aA的意思。注意使用”[]”与”|”的区别,在于”[]”只能匹配单个字符,而”|”可以匹配任意长度的字符串。在使用”[]”的时候,往往配合连接字符”-“一起使用,如[a-d],代表a或b或c或d。

排除字符,排除操作

正则表达式提供了”^”来表示排除不符合的字符,^一般放在[]中。如[^1-5],该字符不是1~5之间的数字。

限定符(?*+{n,m})

限定符主要是用来限定每个字符串出现的次数。

限定字符 含义 ? 零次或一次 * 零次或多次 + 一次或多次 {n} n次 {n,} 至少n次 {n,m} n到m次

如(D+)表示一个或多个D

点号操作符

匹配任意一个字符(不包含换行符)

表达式中的反斜杠()

表达式中的反斜杠有多重意义,如转义、指定预定义的字符集、定义断言、显示不打印的字符。

转义字符

转义字符主要是将一些特殊字符转为普通字符。而这些常用特殊字符有”.”,”&#;”、””等。

指定预定义的字符集

字符 含义 d 任意一个十进制数字[0-9] D 任意一个非十进制数字 s 任意一个空白字符(空格、换行符、换页符、回车符、字表符) S 任意一个非空白字符 w 任意一个单词字符 W 任意个非单词字符

###显示不可打印的字符

字符 含义 a 报警 b 退格 f 换页 n 换行 r 回车 t 字表符

括号字符()

在正则表达式中小括号的作用主要有:

改变限定符如(|、* 、^)的作用范围

如(my|your)baby,如果没有”()”,|将匹配的是要么是my,要么是yourbaby,有了小括号,匹配的就是mybaby或yourbaby。

进行分组,便于反向引用

反向引用

反向引用,就是依靠子表达式的”记忆”功能,匹配连续出现的字串或是字符。如(dqs)(pps),表示匹配字符串dqsppsdqspps。在下面php应用中,我将详细展开学习反向引用。

模式修饰符

模式修饰符的作用是设定模式,也就是正则表达式如何解释。php中主要模式如下表:

修饰符 说明 i 忽略大小写 m 多文本模式 s 单行文本模式 x 忽略空白字符

正则表达式在php中应用

php中字符串匹配

所谓的字符串匹配,言外之意就是判断一个字符串中,是否包含或是等于另一个字符串。如果不使用正则,我们可以使用php中提供了很多方法进行这样的判断。

不使用正则匹配

strstr函数

string strstr ( string haystack,mixedneedle [, bool $before_needle = false ])

注1:haystack是当事字符串,needle是被查找的字符串。该函数区分大小写。

注2:返回值是从needle开始到最后。

注3:关于$needle,如果不是字符串,被当作整形来作为字符的序号来使用。

注4:before_needle若为true,则返回前东西。

stristr函数与strstr函数相同,只是它不区分大小写

strpo函数

int strpos ( string haystack,mixedneedle [, int $offset = 0 ] )

注1:可选的 offset 参数可以用来指定从 haystack 中的哪一个字符开始查找。返回的数字位置是相对于 haystack 的起始位置而言的。

stripos -查找字符串首次出现的位置(不区分大小定)strrpos -计算指定字符串在目标字符串中最后一次出现的位置strripos -计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)

使用正则进行匹配

在php中,提供了preg_math()和preg_match_all函数进行正则匹配。关于这两个函数原型如下:

php正则表达式基本知识与应用详解【经典教程】(php 正则)

int preg_match|preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

搜索subject与pattern给定的正则表达式的一个匹配.pattern:要搜索的模式,字符串类型。subject :输入字符串。matches:如果提供了参数matches,它将被填充为搜索结果。 matches[0]将包含完整模式匹配到的文本,matches[1]将包含第一个捕获子组匹配到的文本,以此类推。flags:flags可以被设置为以下标记值:PREG_OFFSET_CAPTURE 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。offset:通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。返回值:preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为 preg_match()在第一次匹配后 将会停止搜索。 preg_match_all()不同于此,它会一直搜索subject直到到达结尾。 如果发生错误 preg_match()返回 FALSE。

实例

实例1

判断字符串” am a good boy”中是否包含单词go

首先判断是单词,而不是字符串,因此比较的时候,需要比较是否包含' go ‘,即在字符串go前后有一个空格。

解析:如果使用非正则比较,只需要调用上面的checkStr1()函数即可,注意,第二个参数前后要加一个空格,即' go ‘。如果使用正则,

我们可以考虑使用单词定界符b,那么$pattern='/bgob/';然后调用checkStr2函数即可.

例3(考察反向引用)

判断字符串”I am a good boy”中是否包含3个相同的字母

解析:此时,如果我们不使用正则,将会很难判断,因为字母太多了,我们不可能去将所有字母分别与该字符串比较,那样工作量也比较大。这时候涉及到了正在的反向引用。在php正则表达式中,通过n,来表示第n次匹配到的结果。如5代表第五次匹配到的结果。那么本题的$pattern='/(w).*1.*1/';

主要注意的是,在使用反向匹配的时候都需要使用(),反向匹配时,匹配()里面出现的字符或字符串。

php中字符串替换

不使用正则

php中当替换字符串的时候,如果不适用正则,我们通常使用substr、mb_substr、str_replace、substr_replace关于这几个函数区别如下表。

函数符 功能 描述 str_replace(find,replace,string,count) 使用一个字符串替换字符串中的另一些字符。 find 必需。规定要查找的值。replace 必需。规定替换 find 中的值的值。string 必需。规定被搜索的字符串。count 可选。一个变量,对替换数进行计数。 substr_replace(string,replacement,start,length) 把字符串的一部分替换为另一个字符串。适合用于替换自定位置的字符串。 string 必需。规定要检查的字符串。replacement 必需。规定要插入的字符串。start 必需。规定在字符串的何处开始替换。

使用正则

如果使用正则替换,php中提供了preg_replace _callback和preg_replace 函数,preg_replace 原型如下:

mixed preg_replace ( mixed pattern,mixedreplacement , mixed subject[,intlimit = -1 [, int &count]])

函数功能描述:在字符串subject中,查找pattern,然后使用replacement 去替换,如果有limit则代表限制替换limit次。pregreplacecallback与pregreplace功能相识,不同的是pregreplaceback使用一个回调函数callback来代替replacement.&#;例1将字符串”hello,中国”中的hello替换为′你好′;如果不是用正则:str='hello,中国';

或是使用

使用正则

- 例2

去除字符串”gawwenngeeojjgegop”中连续相同的字母

解析:当然这样可能会遇到,当第一次去除了重复了字符串后,又出来重复的字符串。如字符串味'gewwenngeeojjgegop',针对这中问题,当然,这样的话,通过判断,继续替换下去。

例3

将字符串中”agegegep3iorjikk”;中出现的连续两个数字改为第二个数字,如字符串中被改为3

解析:$n在正则表达式外使用反向引用。n代表第几次匹配到的结果。

php中字符串分割

不使用正则

php提供了explode函数去分割字符串,与其对应的是implode。关于explode原型如下:array explode ( string delimiter,stringstring [, int $limit ] )delimiter:边界上的分隔字符。string:输入的字符串。limit:如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素。如果 limit 是 0,则会被当做 1。

使用正则

关于通过正则表达式进行字符串分割,php提供了split、preg_split 函数。preg_split() 函数,通常是比 split() 更快的替代方案。

array preg_split ( string pattern,stringsubject [, int limit=&#;1[,intflags = 0 ]] )

例题

将字符串 ‘ 函数符 描述 *&#; 零次或多次,但尽可能少的匹配 +&#; 一次或多次,但尽可能少的匹配 &#;&#; 0次或1次,但尽可能少的匹配 {n,}&#; 至少n次,但尽可能少的匹配 {n,m}&#; n到m次 ,但尽可能少的匹配

php正则表达式之回溯与固态分组

回溯

首先我们需要清楚什么是回溯,回溯就像是在走岔路口,当遇到岔路的时候就先在每个路口做一个标记。如果走了死路,就可以照原路返回,直到遇见之前所做过的标记,标记着还未尝试过的道路。如果那条路也走不能,可以继续返回,找到下一个标记,如此重复,直到找到出路,或者直到完成所有没有尝试过的路。首先我们看例题

看到上面的程序,可能都清楚是什么意思,就是匹配$str是否包含这样一个由”a+0个或多个字母+c”不区分大小写的字符串。但是至于程序怎样去匹配的呢?匹配的过程中,回溯了多少次呢?

匹配过程 接下来操作描述 ‘aw*c'中a匹配到'aageacwgewcaw'中第一个字符a w进行下一个字符匹配 因为w是贪婪匹配,会一直匹配到'aageacwgewcaw'中最后一个字符w c进行下一个字符匹配时 ‘aw*c'中c发现没有可以匹配的 于是w匹配进行第一次回溯,匹配到倒数第二个字符a ‘aw*c'中c发现还是没有可以匹配的 于是w匹配进行第二次回溯,匹配到倒数第三个字符c ‘aw*c'中c匹配成功 匹配结束返回结果

现在,如果我们将pattern改为pattern='/aw*&#;c/i';又会回溯多少次呢?正确答案是回溯四次。

固态分组

固态分组,目的就是减少回溯次数, 使用(&#;>…)括号中的匹配时如果产生了备选状态,那么一旦离开括号便会被立即 引擎抛弃掉。举个典型的例子如: ‘w+:'这个表达式在进行匹配时的流程是这样的,会优先去匹配所有的符合w的字符,假如字符串的末尾没有':',即匹配没有找到冒号,此时触发回溯机制,他会迫使前面的w+释放字符,并且在交还的字符中重新尝试与':'作比对。但是问题出现在这里: w是不包含冒号的,显然无论如何都不会匹配成功,可是依照回溯机制,引擎还是得硬着头皮往前找,这就是对资源的浪费。所以我们就需要避免这种回溯,对此的方法就是将前面匹配到的内容固化,不令其存储备用状态!,那么引擎就会因为没有备用状态可用而只得结束匹配过程。大大减少回溯的次数。

如下代码,就不会进行回溯:

当然有的时候,又需慎用固态分组,如下,我要检查$str中是否包含以a结尾的字符串,很明显是包含的,但是因为使用了固态分组,反而达不到我们想要的效果

php中其他常用字符串操作函数

字符串截取截取string substr ( string string,intstart [, int length])stringmbsubstr(stringstr , int start[,intlength = NULL [, string $encoding = mb_internal_encoding() ]] )字符串中大小写转换strtoupperstrtolowerucfirstucwords字符串比较-strcmp、strcasecmp、strnatcmp字符串过滤字符串翻转strrev($str);字符串随机排序string str_shuffle ( string $str )

补充

怎样进行邮箱匹配,url匹配,手机匹配

使用preg_match函数进行匹配,以下内容从TP中复制而来。邮箱验证

url匹配

手机验证

php中正则的优缺点

php中正则在某些时候,能帮我们解决php函数很多困难的匹配或是替换。然后php中正则的效率,往往是我们需要考虑的,所以在某些时候,能不用正则还是尽量不去用它,除非,某些场合必须用到,或是我们能够有效减少其回溯次数。

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:

php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】 本文实例讲述了php实现不通过扩展名准确判断文件类型的方法。分享给大家供大家参考,具体如下:第一种方法通过php的finfo_file()$handle=finfo_open(FILEINFO_M

PHP使用finfo_file()函数检测上传图片类型的实现方法 本文实例讲述了PHP使用finfo_file()函数检测上传图片类型的实现方法。分享给大家供大家参考,具体如下:在输入输出中,文件的交互必不可少,比如文

PHP实现的数独求解问题示例 本文实例讲述了PHP实现的数独求解问题。分享给大家供大家参考,具体如下:一、数独问题描述:对于给出的数字二维数组,要求每行每列的数字不能

标签: php 正则

本文链接地址:https://www.jiuchutong.com/biancheng/292543.html 转载请保留说明!

上一篇:关于php 高并发解决的一点思路(php处理并发有哪些技术)

下一篇:php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】(php不能通过浏览器运行吗)

  • 利润表里面的所得税
  • 流转税解释
  • 公司收据收款人怎么写
  • 研发费用明细账
  • 建筑企业外管证有效期
  • 小规模季报财务报表怎么填写
  • 劳务外包可以差额纳税吗
  • 没申报可以开票嘛
  • 企业发生破产清算
  • 非货币性资产交换固定资产清理
  • 装修费能否一次性支付
  • 不带息票据贴现计算公式
  • 报关单金额大于合同金额
  • 给客户现金回款怎么写
  • 投资收益会计处理
  • 土地使用税的计算公式举例子
  • 房改房继承需要原单位开证明吗
  • 施工服务费税率9%
  • 高新技术企业享受什么优惠政策
  • 没有发票的固定资产可以税前扣除吗
  • 增加以前年度收入是否需要更正申报年报
  • 收到个税手续费返还现金流量表
  • 货物销售价比采购价高
  • 净利润怎么计入所有者权益
  • 小规模纳税人会计核算健全,能够提供准确
  • 企业研发人员数量在哪里查
  • 发票未到的费用怎么处理
  • 简易计税发票如何抵扣
  • 快递公司账务处理流程及方法
  • 物流运输公司要交税吗
  • 商贸企业小规模转一般纳税人条件
  • enter an integer
  • idea 创建maven项目读取pom报错
  • c语言中函数的实参和形参
  • 从汽车生产到销售有哪些过程
  • 公司开的餐费专票可以抵扣吗
  • 公账转给员工工资
  • 财务费用在贷方,怎么结转到本年利润?
  • php fgetc
  • 有净残值的固定资产累计折旧怎么算
  • 房地产企业收到定金是否要预缴税款
  • 客户发票弄丢了应该如何补救
  • 筹建期发生的费用会计分录
  • 天使投资
  • access untagged
  • sqlyog与mysql
  • 中标的工程交易怎么处理
  • 现金流量表季度期初现金余额怎么填
  • 预收账款所得税汇算清缴需要调吗
  • 行政拨款给工会的账务处理
  • 困难行业企业包括哪四大类
  • 收购企业如何做账务处理
  • 广告费属于管理费用的哪一类
  • 弃置费用的摊销计算
  • 利息收入和应收利息
  • 关于注册资本的最新规定
  • 进项税的发票
  • SQLServer Execpt和not in 性能区别
  • Mysql Explain 详细介绍
  • ubuntu vnc远程
  • 笔记本开机白屏进不了桌面
  • win10预览版21277
  • 乾坤大挪移秘籍图片
  • OS X 10.10 Yosemite的新特性与iOS联系更紧密
  • micc是什么意思中文
  • 安装win7系统后无法引导启动
  • vlcplayer最新版
  • cocos2dx怎么创建工程
  • unity2019新功能
  • 优化了一些已知问题是什么意思安不安装
  • Express作者TJ告别Node.js奔向Go
  • threejs 源码
  • javascript基础笔记
  • vs开发unity教程
  • jq获取table元素
  • Python的collections模块中namedtuple结构使用示例
  • 四川省成都市国池酒厂52度原浆多少钱一瓶
  • 西藏五个确保是什么?
  • 广西小学成绩查询入口官网
  • 农转非和非农
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设