PHP正则表达式函数学习
正则表达式是在日常开发中经常用到的,通常一些使用频率过高的正则表达式都是直接粘贴复制,对于基础正则的使用还是要铭记于心的,今天抽时间整理一些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来查看区别:
$pattern = '/[0-9]/';
$subject = 'afdddd3asfs4asf6asf1';
$m1= $m2 = []; preg_match($pattern, $subject, $m1);
preg_match_all($pattern, $subject, $m2); show($m1);
echo '<hr>';
show($m2);
结果:
Array
(
[0] => 3
)
----------------------
Array
(
[0] => Array
(
[0] => 3
[1] => 4
[2] => 6
[3] => 1
) )
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:
$pattern = '/[0-9]/';
$subject = 'afdddd3asfs4asf6asf1';
$replacement = 'CHINA'; $str1 = preg_replace($pattern, $replacement, $subject);
$str2 = preg_filter($pattern, $replacement, $subject); show($str1);
echo '<hr>';
show($str2);
结果1:
afddddCHINAasfsCHINAasfCHINAasfCHINA
-------------------------------------
afddddCHINAasfsCHINAasfCHINAasfCHINA
preg_replace 和 preg_filter都支持数组替换的,继续看区别
测试2:
//$pattern = '/[0-9]/';
$pattern = [ '/[123]/', '/[4567]/', '/[890]/'];
$subject = 'afdddd3asfs4asf9asf1';
//$replacement = 'CHINA';
$replacement = ['你', '好', '吗']; $str1 = preg_replace($pattern, $replacement, $subject);
$str2 = preg_filter($pattern, $replacement, $subject); show($str1);
echo '<hr>';
show($str2);
结果2:
afdddd你asfs好asf吗asf你
------------------------------
afdddd你asfs好asf吗asf你
貌似还是没有区别和变化,继续测试
测试3:
//$pattern = '/[0-9]/';
$pattern = [ '/[123]/', '/[4567]/', '/[890]/'];
//$subject = 'afdddd3asfs4asf9asf1';
$subject = ['afddd', 'd3asf', 's4', 'as', '9as', 'f1'];
//$replacement = 'CHINA';
$replacement = ['你', '好', '吗']; $str1 = preg_replace($pattern, $replacement, $subject);
$str2 = preg_filter($pattern, $replacement, $subject); show($str1);
echo '<hr>';
show($str2);
结果3:
Array
(
[0] => afddd
[1] => d你asf
[2] => s好
[3] => as
[4] => 吗as
[5] => f你
)
--------------------
Array
(
[1] => d你asf
[2] => s好
[4] => 吗as
[5] => f你
)
由此可见,preg_replace 替换会把每一个数组中的元素都进行一次匹配替换,无论有没有匹配成功,返回值中的元素都会保留,而preg_filter 只会保留匹配成功的元素;
5、preg_grep ( $pattern, array $input ) // 返回匹配模式的数组条目
只做匹配,不做替换,是preg_filter的简版;
参数说明:
pattern 要搜索的模式,字符串形式
input 输入数组
通过demo查看效果:
$pattern = '/[0-9]/';
$subject = ['afddd', 'd3asf', 's4', 'as', '9as', 'f1'];
$str1 = preg_grep($pattern, $subject);
show($str1);
结果:
Array
(
[1] => d3asf
[2] => s4
[4] => 9as
[5] => f1
)
由此可见,preg_grep针对 subject 中的每一个元素都进行了匹配,且结果只会打印匹配到的数据;
6、preg_split ( $pattern, $subject ) // 通过一个正则表达式分隔字符串
说明:通过正则表达式匹配字符串,将字符串按正则拆分成数组,如果你不需要正则表达式功能,可以有更快(并且更简单)的选择比如 explode() 或 str_split()。如果没有成功匹配,将会返回一个数组,包含了单个元素,即输入的字符串。
参数说明:
pattern 用搜索的模式,字符串形式。
subject 输入字符串
通过demo查看效果:
$pattern = '/[0-9]/';
$subject = '我在3上海5,你知道2的吗?';
$str1 = preg_split($pattern, $subject);
show($str1);
结果:
Array
(
[0] => 我在
[1] => 上海
[2] => ,你知道
[3] => 的吗?
)
由此可见,通过正则表达式,凡是遇到0-9之间的阿拉伯数字都会切一刀拆分成数组;
7、preg_quote($str) //转义正则表达式字符
说明:preg_quote()需要参数 str
并向其中 每个正则表达式语法中的字符前增加一个反斜线。 这通常用于你有一些运行时字符串 需要作为正则表达式进行匹配的时候。
正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
注意 / 不是正则表达式特殊字符
用demo示例效果:
$str = 'this is {abc} and [456]';
$str = preg_quote($str);
show($str);
结果:
this is \{abc\} and \[456\]
由此可见,{} 花括号和 [] 方括号都是正则表达式的特殊符号,通过preg_quote 函数进行转译后多了\,因此进行正则匹配的时候会忽略该特殊符号;
二、正则表达式常用总结
1、都以preg_ 开头
2、除 preg_quote 函数之外,第一个参数都是正则表达式
3、preg_match -------表单验证等
4、preg_replace -----非法词语过滤等
注:学习笔记
PHP正则表达式函数学习的更多相关文章
- Oracle 正则表达式函数-REGEXP_REPLACE
背景 当初写oracle的一个存储过程,以前不知道sql里也有正则表达式,关于正则表达式教程很多了,这里只是记录下Oracle也有这个功能,下次再有类似需求用这个处理的确方便很多. 想起存储过程,就想 ...
- Python3中的字符串函数学习总结
这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...
- Drools 函数学习
Drools 函数学习 函数是定义在规则文件当中一代码块,作用是将在规则文件当中若干个规则都会用到的业务操作封装起来,实现业务代码的复用,减少规则编写的工作量.函数的编写位置可以是规则文件当中 pac ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- C语言(函数)学习之strstr strcasestr
C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...
- Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解
1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹 ...
- Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace
Oracle正则表达式函数:regexp_like.regexp_substr.regexp_instr.regexp_replace --去掉所有特殊字符,只剩字母 SELECT REGEXP ...
- 【jmeter】JMeter函数学习
JMeter函数是一些能够转化在测试树中取样器或者其他配置元件的域的特殊值.一个函数的调用就像这样:${_functionName(var1,var2,var3)},-functionName匹配函数 ...
- PHP-PCRE正则表达式函数
PCRE正则表达式函数 PCRE字符类 \\b 词边界 \\d 匹配任意数字 \\s 匹配任意空白,如TAB制表符或空格 \\t 匹配一个TAB ...
随机推荐
- Cocos2dx源码赏析(2)之渲染
Cocos2dx源码赏析(2)之渲染 这篇,继续从源码的角度来跟踪下Cocos2dx引擎的渲染过程,以此来梳理下Cocos2dx引擎是如何将精灵等元素显示在屏幕上的. 从上一篇对Cocos2dx启动流 ...
- mybatis学习----------查询数据库返回结果为空
用mybits查询数据库时,如果参数已传入sql,sql也已经执行了,但是返回结果为空,首先保证数据库中有对应数据,如果有对应数据仍返回null,是数据库配置文件有问题.解决方案如下:1.mapper ...
- xlrd模块学习
python常用模块目录 )# 打开Excel文件读取数据 import xlrd workbook = xlrd.open_workbook('mcw_test.xlsx') print(workb ...
- 20135234mqy-——信息安全系统设计基础第七周学习总结
第六章 存储器层次结构 存储器系统是一个具有不同容量,成本和访问时间的存储设备的层次结构. CPU寄存器保存着最常用的数据. 靠近CPU的小的,快速的高速缓存存储器作为一部分存储在相对较慢的主存储器( ...
- 可视化实时Web日志分析工具-goaccess
说到web服务器就不得不说Nginx,目前已成为企业建站的首选.但由于种种历史原因,Nginx日志分析工具相较于传统的apache.lighthttp等还是少很多. 今天就和大家分享一个非常强大的实时 ...
- 软工1816 · Beta冲刺(7/7)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 协助完成安卓端的整合 完成安卓端的美化 协助制作宣传视频 接下来的计划 &am ...
- MIT挑战(如何在12个月内自学完成MIT计算机科学的33门课程|内附MIT公开课程资源和学习顺序
译者注:本文译自Scott H. Young的博客,Scott拥有超强的学习能力,曾在12个月内自学完成麻省理工学院计算机科学的33门课程.本文就是他个人对于这次MIT挑战的介绍和总结. 版权声明:本 ...
- 福州大学软工1816 K 班助教总结
春节时期总有各种诱惑因素(例如路人超能第二季),拖到现在才发布十分抱歉orz. 一.感谢 首先对柯老师和软工助教指导团队这一学期以来的支持和指导表示感谢.第一次做助教,有时候会提出一些不大成熟的想法, ...
- Java面试&编写程序:使子线程循环10次,紧接着主线程循环100次,来回50次
package com.cwcec.test; public class TraditionalThreadCommunication { /** * @param args */ public st ...
- Java& Vector与ArrayList区别
在写java的时候,基本上都喜欢用arraylist,甚至我都不知道有个vector的存在.查了一下发现又是线程安全问题...咋个线程安全天天围着我转呢...多得阿里巴巴,让我开始认识java的所谓线 ...