热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP正则表达式实例

这个条件语句来判断开始的标记跟闭合的标记是否相等,不相等就说明没闭合。最后用in_array($start_tags[1][$i],

1 使用正则表达式来检测HTML 是否关闭
代码片段
 

PHP代码
  1. function check_html($html) {   
  2. preg_match_all("/<([a-zA-Z0-9]+)\\s*[^\\/>]*>/",$html,$start_tags);   
  3. preg_match_all("/<\\/([a-zA-Z0-9]+)>/", $html, $end_tags);   
  4. if(count($start_tags[1]) != count($end_tags[1])) return false;   
  5. for($i = 0; $i < count($start_tags[1]); $i++) {   
  6. if(!in_array($start_tags[1][$i], $end_tags[1])) return false;   
  7. }   
  8. return true;   
  9. }   

解释:
/<([a-zA-Z0-9]+)\\s*[^\\/>]*>/这个模式是用来匹配HTML 的标记(如:、

等等,但是除了
这种)的,并且在$start_tags 保持着标签
的名字(如:head、div 等)。而/<\\/([a-zA-Z0-9]+)>/这个模式是用来匹配闭合的HTML
标记(如:,
等)的。并且在$end_tags 中保持这闭合的标签名。然后我们用
count($start_tags[1]) != count($end_tags[1])这个条件语句来判断开始的标记跟闭合的
标记是否相等,不相等就说明没闭合。最后用in_array($start_tags[1][$i], $end_tags[1])
来判断开始标跟闭合的标记是否相等。至此,我们就完成了HTML 的匹配了!
2 匹配E-mail 格式
代码片段
 

PHP代码
  1. function check_email($email) {   
  2. if(preg_match("/^[\w\d!#$%&'*+-\/=?^`{|}~]+(\.[\w\d!#$%&'*+-\/=?^`{|}~]+)*@([a-z\d][-a-z\  
  3. d]*[a-z\d]\.)+[a-z][-a-z\d]*[a-z]$/", $eamil)) return true;   
  4. return false;   
  5. }   

解释:
不要被
/^[\w\d!#$%&'*+-\/=?^`{|}~]+(\.[\w\d!#$%&'*+-\/=?^`{|}~]+)*@([a-z\d][-a-z\d]*[az\
d]\.)+[a-z][-a-z\d]*[a-z]$/
这条模式给吓跑了, 其实也很简单的。前部分
[\w\d!#$%&'*+-\/=?^`{|}~]+(\.[\w\d!#$%&'*+-\/=?^`{|}~]+)*只是匹配符合RFC-2882 标
准的E-mail 地址允许出现的字符,就是英文字母,数字跟一些符号,有兴趣可以查询
RFC-2882 手册,而([a-z\d][-a-z\d]*[a-z\d]\.)+就是匹配HOST 的。最后[a-z][-a-z\d]*[a-z]
就是匹配顶级域名的(如:.com、.org)。
3 非贪心模式
有时候使用正则表达式的时候,你会发现有以下的问题:
代码片段
 

PHP代码
  1. preg_match('/".*"/', 'Tony say:"hello", Jack say: "Hi"', $matches);   
  2. print_r($matches);  


很惊奇的你会发现匹配的是这样的内容"hello", Jack say: "Hi",而不是"hello"和
"Hi"。这就是贪心匹配引起的。在贪心匹配中,正则表达式会尽可能的匹配最多的字
符,所以出现了第一种情况,但是我们想要的是第二种情况,那我们要怎么做呢?
我们可以使用非贪心匹配,将刚才的模式改为/".*?"/这样就可以看见我们想要的
结果了。*?这个就是非贪心匹配模式。还有另外一种就是+?。
? *?:前面的字符可以出现任意多次,但是遇到*?后的一个字符即停止匹配。
? +?:前面的字符可以出现一次或者多次,但是遇到+?后的一个字符即停止匹
配。
4 检测一个用户密码是否安全
代码片段
 

PHP代码
  1. function is_good_pw($pw) {   
  2. if(preg_match('/(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}/', $pw)) {   
  3. return true;   
  4. }   
  5. return false;   
  6. }  


解释:
在本例中,我们使用了/(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}/模式来匹配我们的
密码。在这个模式中,我们使用了正则表达式中的前瞻模式(?=)。(?=.*[0-9])这个是匹
配密码中有数字,而(?=.*[a-z])是匹配密码中有小写字母,最后(?=.*[A-Z])就是匹配密
码中有大写字母。而.{8,16}这个就是匹配密码是由8 至16 个字符组成的。那么我们
的密码就需要有数字,大写字母和小写字母组成的就属于安全的密码了~
5 匹配一个网站中的所有链接
代码片段
 

PHP代码
  1. function get_links($link) {   
  2. $html = file_get_contents($link);   
  3. $html = str_replace("\n", "", $html);   
  4. $html = preg_replace('/
  5. $html = preg_replace('/<\/a>/', "\n", $html);   
  6. preg_match_all('/.*?<\/a>/', $html, $matches);   
  7. return($matches);   
  8. }  


在这个例子中,我们想用file_get_contents 来取得一个网页的内容。然后用
str_replace("\n", "", $html)把所有的换行去掉。再用preg_replace('/ preg_replace('/<\/a>/', "\n", $html)来把所有的.....模式另起一行。
最后就用preg_match_all('/.*?<\/a>/', $html, $matches) 匹配链接模式。
/.*?<\/a>/就是匹配.....这种模式的正则表达式。那我们为什
么要把.....链接另起一行呢??因为在/.*?<\/a>/模式中,.*
是不能匹配换行的,所以就如不在同一行就不能匹配了!!所以我们要这样
做!



推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
author-avatar
姚威阳_489
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有