正则表达式是在日常开发中经常用到的,通常一些使用频率过高的正则表达式都是直接粘贴复制,对于基础正则的使用还是要铭记于心的,今天抽时间整理一些php正则表达式的用法。

一、php中常用的正则表达式函数

  preg_match() 与 preg_match_all()

  1、preg_match ( $pattern, $subject, [ array &$matchs ] );   //执行匹配正则表达式

  2、preg_match_all ( $pattern, $subject, array &$matches ); //执行一个全局正则表达式匹配

  返回结果:匹配到结果的次数;

  参数说明:

    pattern 要搜索的模式,字符串类型

    subject 输入字符串

    matches 对于第一个函数,如果提供了参数matches,它将被填充为搜索结果。$matches[0]将包含完整模式匹配到的文本,$matches[1] 将包含捕获子组匹配到的文本。

        对于第二个函数,matches是必填项,它是一个多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。

一个简单的demo来查看区别:

  1. $pattern = '/[0-9]/';
  2. $subject = 'afdddd3asfs4asf6asf1';
  3. $m1= $m2 = [];
  4.  
  5. preg_match($pattern, $subject, $m1);
  6. preg_match_all($pattern, $subject, $m2);
  7.  
  8. show($m1);
  9. echo '<hr>';
  10. show($m2);  

结果: 

  1. Array
  2. (
  3. [0] => 3
  4. )
  5. ----------------------
  6. Array
  7. (
  8. [0] => Array
  9. (
  10. [0] => 3
  11. [1] => 4
  12. [2] => 6
  13. [3] => 1
  14. )
  15.  
  16. )

  preg_replace 与 preg_filter

  3、preg_replace ( $pattern, $replacement, $subject )  //执行一个正则表达式的搜索和替换

  4、preg_filter ( $pattern, $replacement, $subject )       //执行一个正则表达式搜索和替换

   参数说明:

    pattern 要搜索的模式。可以使一个字符串或者字符串数组。可以使用PCRE修饰符

    replacement 用于替换的字符串或者字符串数组。

    subject 要进行搜索和替换的字符串或字符串数组。

  区别:preg_filter 它仅仅返回(可能经过转化)与目标匹配的结果,功能和preg_replace类似

  返回值:如果subject是一个数组,返回一个数组, 其他情况返回一个字符串。

      如果没有找到匹配或者发生了错误,当subject是数组 时返回一个空数组,其他情况返回NULL

分别用3个简单的demo来查看区别:

测试1: 

  1. $pattern = '/[0-9]/';
  2. $subject = 'afdddd3asfs4asf6asf1';
  3. $replacement = 'CHINA';
  4.  
  5. $str1 = preg_replace($pattern, $replacement, $subject);
  6. $str2 = preg_filter($pattern, $replacement, $subject);
  7.  
  8. show($str1);
  9. echo '<hr>';
  10. show($str2);

 结果1: 

  1. afddddCHINAasfsCHINAasfCHINAasfCHINA
    -------------------------------------
  2. afddddCHINAasfsCHINAasfCHINAasfCHINA

preg_replace 和 preg_filter都支持数组替换的,继续看区别

测试2: 

  1. //$pattern = '/[0-9]/';
  2. $pattern = [ '/[123]/', '/[4567]/', '/[890]/'];
  3. $subject = 'afdddd3asfs4asf9asf1';
  4. //$replacement = 'CHINA';
  5. $replacement = ['你', '好', '吗'];
  6.  
  7. $str1 = preg_replace($pattern, $replacement, $subject);
  8. $str2 = preg_filter($pattern, $replacement, $subject);
  9.  
  10. show($str1);
  11. echo '<hr>';
  12. show($str2);

 结果2:

  1. afddddasfsasfasf
  2. ------------------------------
  3. afddddasfsasfasf

 貌似还是没有区别和变化,继续测试

测试3: 

  1. //$pattern = '/[0-9]/';
  2. $pattern = [ '/[123]/', '/[4567]/', '/[890]/'];
  3. //$subject = 'afdddd3asfs4asf9asf1';
  4. $subject = ['afddd', 'd3asf', 's4', 'as', '9as', 'f1'];
  5. //$replacement = 'CHINA';
  6. $replacement = ['你', '好', '吗'];
  7.  
  8. $str1 = preg_replace($pattern, $replacement, $subject);
  9. $str2 = preg_filter($pattern, $replacement, $subject);
  10.  
  11. show($str1);
  12. echo '<hr>';
  13. show($str2);

  结果3:

  1. Array
  2. (
  3. [0] => afddd
  4. [1] => dasf
  5. [2] => s
  6. [3] => as
  7. [4] => as
  8. [5] => f
  9. )
  10. --------------------
  11. Array
  12. (
  13. [1] => dasf
  14. [2] => s
  15. [4] => as
  16. [5] => f
  17. )

  由此可见,preg_replace 替换会把每一个数组中的元素都进行一次匹配替换,无论有没有匹配成功,返回值中的元素都会保留,而preg_filter 只会保留匹配成功的元素;

  5、preg_grep ( $pattern, array $input ) // 返回匹配模式的数组条目

    只做匹配,不做替换,是preg_filter的简版;

  参数说明:

    pattern 要搜索的模式,字符串形式

    input 输入数组

通过demo查看效果:

  1. $pattern = '/[0-9]/';
  2. $subject = ['afddd', 'd3asf', 's4', 'as', '9as', 'f1'];
  3. $str1 = preg_grep($pattern, $subject);
  4. show($str1);

 结果:

  1. Array
  2. (
  3. [1] => d3asf
  4. [2] => s4
  5. [4] => 9as
  6. [5] => f1
  7. )

  由此可见,preg_grep针对 subject 中的每一个元素都进行了匹配,且结果只会打印匹配到的数据;

  6、preg_split ( $pattern, $subject ) // 通过一个正则表达式分隔字符串

  说明:通过正则表达式匹配字符串,将字符串按正则拆分成数组,如果你不需要正则表达式功能,可以有更快(并且更简单)的选择比如 explode() 或 str_split()。如果没有成功匹配,将会返回一个数组,包含了单个元素,即输入的字符串。

  参数说明:

    pattern 用搜索的模式,字符串形式。

    subject 输入字符串

通过demo查看效果:

  1. $pattern = '/[0-9]/';
  2. $subject = '我在3上海5,你知道2的吗?';
  3. $str1 = preg_split($pattern, $subject);
  4. show($str1);

  结果:

  1. Array
  2. (
  3. [0] => 我在
  4. [1] => 上海
  5. [2] => ,你知道
  6. [3] => 的吗?
  7. )

  由此可见,通过正则表达式,凡是遇到0-9之间的阿拉伯数字都会切一刀拆分成数组;

  7、preg_quote($str) //转义正则表达式字符

    说明:preg_quote()需要参数 str 并向其中 每个正则表达式语法中的字符前增加一个反斜线。 这通常用于你有一些运行时字符串 需要作为正则表达式进行匹配的时候。

      正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

   注意 / 不是正则表达式特殊字符  

用demo示例效果:

  1. $str = 'this is {abc} and [456]';
  2. $str = preg_quote($str);
  3. show($str);

  结果:

  1. this is \{abc\} and \[456\]

  由此可见,{} 花括号和 [] 方括号都是正则表达式的特殊符号,通过preg_quote 函数进行转译后多了\,因此进行正则匹配的时候会忽略该特殊符号;

二、正则表达式常用总结

  1、都以preg_ 开头

  2、除 preg_quote 函数之外,第一个参数都是正则表达式

  3、preg_match -------表单验证等

  4、preg_replace -----非法词语过滤等

 

 注:学习笔记

  

      

  

PHP正则表达式函数学习的更多相关文章

  1. Oracle 正则表达式函数-REGEXP_REPLACE

    背景 当初写oracle的一个存储过程,以前不知道sql里也有正则表达式,关于正则表达式教程很多了,这里只是记录下Oracle也有这个功能,下次再有类似需求用这个处理的确方便很多. 想起存储过程,就想 ...

  2. Python3中的字符串函数学习总结

    这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...

  3. Drools 函数学习

    Drools 函数学习 函数是定义在规则文件当中一代码块,作用是将在规则文件当中若干个规则都会用到的业务操作封装起来,实现业务代码的复用,减少规则编写的工作量.函数的编写位置可以是规则文件当中 pac ...

  4. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  5. C语言(函数)学习之strstr strcasestr

    C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...

  6. Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解

    1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹 ...

  7. Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace

    Oracle正则表达式函数:regexp_like.regexp_substr.regexp_instr.regexp_replace   --去掉所有特殊字符,只剩字母  SELECT REGEXP ...

  8. 【jmeter】JMeter函数学习

    JMeter函数是一些能够转化在测试树中取样器或者其他配置元件的域的特殊值.一个函数的调用就像这样:${_functionName(var1,var2,var3)},-functionName匹配函数 ...

  9. PHP-PCRE正则表达式函数

    PCRE正则表达式函数 PCRE字符类 \\b        词边界 \\d        匹配任意数字 \\s        匹配任意空白,如TAB制表符或空格 \\t        匹配一个TAB ...

随机推荐

  1. golang slice使用不慎导致的问题

    原文链接 : http://www.bugclosed.com/post/16 背景 go语言中切片slice是方便且好用的强大数据结构,但是使用的时候需要注意,不然容易出问题,最近因为遇到了一个sl ...

  2. Spring Boot + MyBatis + Pagehelper 配置多数据源

    前言: 本文为springboot结合mybatis配置多数据源,在项目当中很多情况是使用主从数据源来读写分离,还有就是操作多库,本文介绍如何一个项目同时使用2个数据源. 也希望大家带着思考去学习!博 ...

  3. mkfs命令详解

    mkfs命令-->make filesystem的缩写:用来在特定的分区建立Linux文件系统     [命令作用] 该命令用来在特定的分区创建linux文件系统,常见的文件系统有ext2,ex ...

  4. numastat命令详解

    基础命令学习目录 作者:[吴业亮]博客:http://blog.csdn.net/wylfengyujiancheng一.系统架构的演进从SMP到NUMA1.SMP(Symmetric Multi-P ...

  5. "Hello World!"团队负责人领跑衫感言

    时间:2017年12月7日 团队名称:“Hello World!” 团队项目:空天猎 团队成员:陈建宇(项目负责人).刘淑霞.黄泽宇.方铭.贾男男.刘耀泽.刘成志 感言正文: 记<软件工程> ...

  6. Promise.all请求失败重发功能的实现

    写爬虫时遇到用Promise.all同时请求多个页面,不可避免的会遇到某些请求失败的情况,这时可以实现一个"重发失败请求"的功能. Promise.all(task).then() ...

  7. Daily Scrum1 11.3

    今天是我们团队进入代码实现阶段的第一天,经过一周对上一届项目代码的阅读和研究,队员们已经从代码中分析出我们这次项目将要修改和补充的地方,我们接下来要做的地方就是在两周的时间内将团队项目在alpha阶段 ...

  8. 20135231 JAVA实验报告三:敏捷开发与XP实践

    ---恢复内容开始--- JAVA实验报告三:敏捷开发与XP实践 20135231 何佳 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...

  9. Servlet学习小结

    最近有点小累啊,上课平均一天6小时,再去修一修代码就没什么多的时间了.现在写我最近学习的成果:想想最近软件工程老师留的题目,我还有一些重要的地方没有想清楚.题目是这样的:生成四则运算的题目,算术题目包 ...

  10. 《 Spring1之第二次站立会议(重发)》

    < 第二次站立会议(重发)> 昨天,我把找到的代码和协议资料等相关资料在团队里做了相应的汇报: 今天,我对自己找到的代码进行了相关的了解后,把它们在编译环境中进行了编译以及接着对代码进行逐 ...