PHP 被大量的应用于 Web 的后台 CGI 开发,通常是在用户数据数据之后得出某种结果,但是如果用户输入的数据不正确,就会出现问题,比如说某人的生日是 "2月30日"!那应该怎么样来检验暑假是否正确呢? 在 PHP 中加入了正则表达式的支持,让我们可以十分方便的进行数据匹配。
什么是正则表达式:
简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于 UNIX/LINUX 系统的软件工具中找到正则表达式的痕迹,例如: Perl 或PHP 脚本语言。此外,Javascript 这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。
在某个 Linux 网站上面有这样的话:“如果你问一下 Linux 爱好者最喜欢什么,他可能会回答正则表达式;如果你问他最害怕什么,除了繁琐的安装配置外他肯定会说正则表达式。”
正如上面说的,正则表达式看起来非常复杂,让人害怕,大多数的 PHP 初学者都会跳过这里,继续下面的学习,但是 PHP 中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学实在太可惜了……
正则表达式的基本语法:
一个正则表达式,分为三个部分:分隔符,表达式和修饰符。
分隔符可以是除了特殊字符以外的任何字符(比如 "/ !" 等等),常用的分隔符是 "/"。表达式由一些特殊字符(特殊字符详见下面)和非特殊的字符串组成,比如"[a-z0-9_-]+@[a-z0-9_ -.]+"可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能 / 模式。下面就是一个完整的正则表达式的例子:/hello.+hello/is
上面的正则表达式 "/" 就是分隔符,两个 "/" 之间的就是表达式,第二个 "/" 后面的字符串 "is" 就是修饰符。在表达式中如果含有分隔符,那么就需要使用转义符号 "",比如 "/hello.+/hello/is"。转义符号除了用于分隔符外还可以执行特殊字符,全部由字母构成的特殊字符都需要 "" 来转义,比如 "d" 代表全体数字。
4 正则表达式的特殊字符:
正则表达式中的特殊字符分为元字符、定位字符等等。元字符是正则表达式中一类有特殊意义的字符,用来描述其前导字符(即元字符前面的字符)在被匹配的对象中出现的方式。元字符本身是一个个单一的字符,但是不同或者相同的元字符组合起来可以构成大的元字符。
元字符:
大括号:大括号用来精确指定匹配元字符出现的次数,例如 "/pre{1,5}/" 表示匹配的对象可以是 "pre"、"pree"、"preeeee" 这样在 "pr" 后面出现 1 个到 5 个 "e" 的字符串。或者 "/pre{,5}/" 代表pre 出现 0 此到 5 次之间。
加号:"+" 字符用来匹配元字符前的字符出现一次或者多次。例如 "/ac+/" 表示被匹配的对象可以是 "act"、"account"、"acccc" 等在 "a" 后面出现一个或者多个 "c" 的字符串。"+" 相当于 "{1,}"。
星号:"*" 字符用来匹配元字符前的字符出现零次或者多次。例如 "/ac*/" 表示被匹配的对象可以是 "app"、"acp"、"accp" 等在 "a" 后面出现零个或者多个 "c" 的字符串。"*" 相当于 "{0,}"。
问号:"" 字符用来匹配元字符前的字符出现零次或者 1 次。例如 "/ac/" 表示匹配的对象可以是"a"、"acp"、"acwp" 这样在 "a" 后面出现零个或者 1 个 "c" 的字符串。"" 在正则表达式中还有一个非常重要的作用,即"贪婪模式"。
还有两个很重要的特殊字符就是 "[ ]"。他们可以匹配 "[]" 之中出现过的字符,比如 "/[az]/" 可以匹配单个字符 "a" 或者 "z";如果把上面的表达式改成这样 "/[a-z]/",就可以匹配任何单个小写字母,比如 "a"、"b" 等等。
如果在 "[]" 中出现了 "^",代表本表达式不匹配 "[]" 内出现的字符,比如 "/[^a-z]/" 不匹配任何小写字母!并且正则表达式给出了几种"[]"的默认值:
[:alpha:]:匹配任何字母
[:alnum:]:匹配任何字母和数字
[:digit:]:匹配任何数字
[:space:]:匹配空格符
[:upper:]:匹配任何大写字母
[:lower:]:匹配任何小写字母
[:punct:]:匹配任何标点符号
[:xdigit:]:匹配任何16进制数字
另外下面这些特殊字符在转义符号""转义后代表的含义如下:
s:匹配单个的空格符
S:用于匹配除单个空格符之外的所有字符。
d:用于匹配从0到9的数字,相当于"/[0-9]/"。
w:用于匹配字母,数字或下划线字符,相当于"/[a-zA-Z0-9_]/"。
W:用于匹配所有与w不匹配的字符,相当于"/[^a-zA-Z0-9_]/"。
D:用于匹配任何非10进制的数字字符。
.:用于匹配除换行符之外的所有字符,如果经过修饰符"s"的修饰,"."可以代表任意字符。
利用上面的特殊字符可以很方便的表达一些比较繁琐的模式匹配。例如 "/d0000/" 利用上面的正则表达式可以匹配万以上,十万一下的整数字符串。
定位字符:
定位字符是正则表达式中又一类非常重要的字符,它的主要作用是用于对字符在匹配对象中的位置进行描述。
^:表示匹配的模式出现在匹配对象的开头(和在"[]"里面不同)
$:表示匹配的模式出现在匹配对象的末尾
空格:表示匹配的模式出现在开始和结尾的两个边界之一
"/^he/":可以匹配以"he"字符开头的字符串,比如hello、height等等;
"/he$/":可以匹配以"he"字符结尾的字符串即she等;
"/ he/":空格开头,和^的作用一样,匹配以he开头的字符串;
"/he /":空格结束,和$的作用一样,匹配以he结尾的字符串;
"/^he$/":表示只和字符串"he"匹配。
括号:
正则表达式除了可以用户匹配,还可以用括号 "()" 来记录需要的信息,储存起来,给后面的表达式读取。比如:
/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/
就是记录邮件地址的用户名,和邮件地址的服务器地址(形式为 username@server.com 之类的),在后面如果想要读取记录下来的字符串,只是需要用“转义符+记录的次序”来读取。比如 "1" 就相当于第一个 "[a-zA-Z0-9_-]+","2" 相当于第二个 ([a-zA-Z0-9_-]+),"3" 就是第三个 (.[a-zA-Z0-9_-])。但是在PHP 中,"" 是一个特殊的字符,需要转义,所以 "1" 到了 PHP 的表达式中就应该写成 "1"。
其他特殊符号:
"|":或符号 "|" 和 PHP 里面的或一样,不过是一个 "|",而不是 PHP 的两个 "||"!意思就是可以是某个字符或者另一个字符串,比如 "/abcd|dcba/" 可能匹配 "abcd" 或者 "dcba"。
5 贪婪模式:
前面在元字符中提到过 "" 还有一个重要的作用,即“贪婪模式”,什么是“贪婪模式”呢?
比如我们要匹配以字母 "a" 开头字母 "b" 结尾的字符串,但是需要匹配的字符串在 "a" 后面含有很多个 "b",比如 "a bbbbbbbbbbbbbbbbb",那正则表达式是会匹配第一个 "b" 还是最后一个 "b" 呢?如果你使用了贪婪模式,那么会匹配到最后一个 "b",反之只是匹配到第一个 "b"。
使用贪婪模式的表达式如下:
/a.+b/
/a.+b/U
不使用贪婪模式的如下:
/a.+b/
上面使用了一个修饰符 U,详见下面的部分。
6 修饰符:
在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着 "e" 并不等于 "E")。正则表达式里面的修饰符如下:
i :如果在修饰符中加上 "i",则正则将会取消大小写敏感性,即 "a "和 "A" 是一样的。
m:默认的正则开始 "^" 和结束 "$" 只是对于正则字符串如果在修饰符中加上 "m",那么开始和结束将会指字符串的每一行:每一行的开头就是 "^",结尾就是 "$"。
s:如果在修饰符中加入 "s",那么默认的 "." 代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!
x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。
E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
U:和问号的作用差不多,用于设置"贪婪模式"。
7 PCRE相关的正则表达式函数:
PHP 的 Perl 兼容正则表达式提供的多个函数,分为模式匹配,替换和匹配数目等等:
1、preg_match:
函数格式:int preg_match(string pattern, string subject, array [matches]);
这个函数会在 string 中使用 pattern 表达式来匹配,如果给定了 [regs],就会将 string 记录到[regs][0] 中,[regs][1] 代表使用括号 "()" 记录下来的第一个字符串,[regs][2] 代表记录下来的第二个字符串,以此类推。preg 如果在 string 中找到了匹配的 pattern,就会返回 "true",否则返回 "false"。
2、preg_replace:
函数格式:mixed preg_replace(mixed pattern, mixed replacement, mixed subject);
这个函数会使用将 string 中符合表达式 pattern 的字符串全部替换为表达式 replacement。如果replacement 中需要包含 pattern 的部分字符,则可以使用 "()" 来记录,在 replacement 中只是需要用 "1" 来读取。
3、preg_split:
函数格式:array preg_split(string pattern, string subject, int [limit]);
这个函数和函数 split 一样,区别仅在与 split 可以使用简单正则表达式来分割匹配的字符串,而 preg_split 使用完全的 Perl 兼容正则表达式。第三个参数 limit 代表允许返回多少个符合条件的值。
4、preg_grep:
函数格式:array preg_grep(string patern , array input);
这个函数和 preg_match 功能基本上,不过 preg_grep 可以将给定的数组 input 中的所有元素匹配,返回一个新的数组。
下面举一个例子,比如我们要检查 Email 地址的格式是否正确:
<?php
function emailIsRight($email) {
if (preg_match("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email)) {
return 1;
}
return 0;
}
if(emailIsRight('y10k@963.net')) echo '正确<br>';
if(!emailIsRight('y10k@fffff')) echo '不正确<br>';
?>
上面的程序会输出"正确<br>不正确"。
8.PHP中的Perl兼容正则表达式和Perl/Ereg正则表达式的区别:
虽然叫做“Perl兼容正则表达式”,但是和 Perl 的正则表达式相比,PHP 的还是由一些不同,比如修饰符“G”在 Perl 里面代表全部匹配,但是在 PHP 中没有加入对这个修饰符的支持。
还有就是和 ereg 系列函数的区别,ereg 也是 PHP 中提供的正则表达式函数,不过和 preg 相比,要弱上很多。
1、ereg 里面是不需要也不能使用分隔符和修饰符的,所以 ereg 的功能比 preg 要弱上不少。
2、关于 ".":点在正则里面一般是除了换行符以外的全部字符,但是在 ereg 里面的 "." 是任意字符,即包括换行符!如果在 preg 里面希望 "." 能够包括换行符,可以在修饰符中加上 "s"。
3、ereg 默认使用贪婪模式,并且不能修改,这个给很多替换和匹配带来麻烦。
4、速度:这个或许是很多人关心的问题,会不会 preg 功能强大是以速度来换取的?不用担心,preg 的速度要远远比 ereg 快,下面是一个程序测试:
time test:
PHP代码:
<?php
echo "Preg_replace used time:";
$start = time();
for($i=1;$i<=100000;$i++) {
$str = "ssssssssssssssssssssssssssss";
preg_replace("/s/","",$str);
}
$ended = time()-$start;
echo $ended;
echo "ereg_replace used time:";
$start = time();
for($i=1;$i<=100000;$i++) {
$str = "ssssssssssssssssssssssssssss";
ereg_replace("s","",$str);
}
$ended = time()-$start;
echo $ended;
echo "str_replace used time:";
$start = time();
for($i=1;$i<=100000;$i++) {
$str = "sssssssssssssssssssssssssssss";
str_replace("s","",$str);
}
$ended = time()-$start;
echo $ended;
?>
结果:
Preg_replace used time:5
ereg_replace used time:15
str_replace used time:2
str_replace因为不需要匹配所以速度非常快,而preg_replace的速度比ereg_replace要快上不少。
9.关于PHP3.0对于preg的支持:
在 PHP 4.0 中默认加入了 preg 支持,但是在 3.0 中确没有。如果在 3.0 中希望使用 preg 函数,必须加载php3_pcre.dll 文件,只要在 php.ini 的 extension 部分设置加入 "extension = php3_pcre.dll" 然后从新启动 PHP 就可以了!
其实正则表达式还常用于 UbbCode 的实现,很多PHP论坛都使用了这个方法(比如 zForum zphp.com 或者 vB vbullent.com)。
相关推荐
《遥感大模型生产级实战:从数据到决策的端到端AI工程》系列第一部分:AI遥感工程师的基础设施与工具链-文章 4:传统遥感分析与机器学习基线
本章将系统性地介绍经典遥感分析工作流,从数据预处理到多维度特征工程,再到如何利用经典的机器学习模型(如随机森林、支持向量机)进行监督与非监督学习。我们将通过一个完整的“智慧农业作物分类”项目实战,展示如何利用我们之前构建的数据湖和工具链,从原始数据到最终的分析结果,构建一个性能可靠、可解释性强的基线系统。更重要的是,我们将深入剖析这种传统方法的局限性,从而为后续章节引入遥感大模型的必要性提供强有力的论证。
正则表达式 常用语法
字符匹配语法: \d 匹配数字(0~9) ‘\d’匹配8,不匹配12; \D 匹配非数字 ‘\D’匹配c,不匹配3; \w 匹配任意单字符 ‘\w\w’ 匹配A3,不匹配@3; \W 匹配非单字符 ‘\W’匹配@,不匹配c; \s 匹配空白字符 ‘\d\s\d’匹配3 d,不匹配abc; \S 匹配非空字符 ‘\S\S\S’匹配A#4,不匹配3 d; . 匹配任意字...
c++2048小游戏编写
最近编写了一个小游戏,叫作2048,用到了面向对象的知识。
php正则表达式风格,php perl风格 正则表达式
/* 查找字符串是正则表达式的主要应用。在php中,可以作用的并且用于匹配perl风格正则表达式的主要函数是 preg_match()。该函数原型如下int preg_match(string pattern, string subject[,array matches[,int flags]])在subject中搜索pattern。$matches[0]将包含与整个模式匹配的文本,$matche...
MPN – 制造商物料编号(延伸)
此外,用户还可以在物料主数据中定义阻止MPN材料的原因,以及在采购订单创建时,是否可以将现有的MPN材料修改为其他MPN材料,从而实现对MPN材料的精细控制和管理。通过使用AMPL,用户可以指定每个MPN材料是否仅能为特定工厂或整个企业所有工厂采购、采购的时间段、是否必须属于特定修订级别、是否只能从特定制造商工厂采购以及是否被阻止及其原因。通过AMPL管理,企业可以规范采购流程,避免使用未经批准的材料,从而提高采购的透明度和效率,同时也为质量控制提供了保障。3、QM中的制造商物料。质量信息记录QI01。
php perl正则表达式,浅析Perl正则表达式在PHP的实现
Perl正则表达式在PHP的实现达成,我们要使用PCRE相关的正则表达式函数,那么具体的都有什么函数呢?这里我们向你介绍4个,希望对你有所帮助。Perl正则表达式在PHP的实现所使用的函数介绍:1、preg_match :函数格式:intpreg_match(stringpattern,stringsubject,array[matches]);这个函数会在string中使用pattern...
GRSL 2026 即插即用 | Transformer篇 | DCSA:动态稀疏门控自注意力,兼顾长距离依赖与局部细节表达!
SDANet整体架构和模块Dynamic Channel Sparse Attention (DCSA):DCSA为Transformer块中的自注意力层。DCSA架构:样本级动态稀疏注意力:首次实现每个样本独立预测注意力稀疏度:通过轻量门控网络根据输入特征的复杂度自适应调整保留的通道数,简单样本使用更高稀疏度(如保留 20% 通道),复杂样本使用更低稀疏度(如保留 80% 通道),在保证精度的前提下平均计算量降低 50% 以上。
PHP中与Perl兼容的正则表达式处理函数
在PHP中给我们提供两套正则表达式函数,POSIX 扩展正则表达式函数(ereg_)和Perl 兼容正则表达式函数(preg_),这两个函数功能一样,Perl 兼容正则表达式函数库效率高, 这里和这符串处理函数对比介绍,能使用字符串处理函数完成的功能,就不要使用正则表达式处理函数 1. 字符串的匹配与查找 字符串处理函数 strstr(a,b) 返回a 字符串从b 第一次出现的位置
【目标检测】基于yolov5的道路坑洼检测(附代码和数据集)
基于yolov5的道路坑洼检测(附代码和数据集)
Jetson AGX Orin平台Jetpack5升级Jetpack6,自研载板USB不工作问题调试
1. 问题描述将AGX Orin工业的新板放到定制的载板上当在ubuntu 22和Jetpack 6.1上使用SDKManager刷机时,lsusb为空,并且在引导时没有发现/注册xusb设备。USB C端口正常打开并供电,但似乎没有数据传输。在Ubuntu 18 Jetpack 5.1.4 SDKManager上同样刷机之后,usb C集线器在引导时被正确地发现,显示在lsusb中,并识别/挂载外部驱动器。
Perl兼容正则表达式函数-PHP8知识详解
在8中有两类正则,一类是兼容函数,另一类是posix扩展正则表达式函数。二者区别不大,我们推荐使用Perl兼容正则表达式函数。
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
在PHP中使用与Perl兼容的正则表达式
来源:PHP动力在线 1 前言 PHP被大量的应用于Web的后台CGI开发,通常是在用户数据数据之后得出某种结果,但是如果用户输入的数据不正确,就会出现问题,比如说某人的生日是"2月30日"!那应该怎么样来检验暑假是否正确呢? 在PHP中加入了正则表达式的支持,让我们可以十分方便的进行数据匹配。 2 什么是正则表达式: 简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
php中 Perl兼容正则表达式 后缀选项
php中 Perl兼容正则表达式 后缀选项 转自:http://www.kaifajie.com/archives/133.html 4.10 Perl兼容正则表达式 4.10.8 后缀选项 Trailing Options Perl风格的正则表达式允许把单个字符选项(标志)放在正则表达式模式后面来修改匹配的解释或行为。例如,要进行不区分大小写的匹配,可以简单地使用i标志: pre
霍尼韦尔SoftMaster使用说明
霍尼韦尔SoftMaster使用说明
在PHP里面运用与Perl兼容地正则表达式【转载】
<br /><br />Submitted by flycat on 2009, July 29, 11:02 PM. PHP<br />1 前言<br />PHP被大量的应用于Web的后台CGI开发,通常是在用户数据数据之后得出某种结果,但是如果用户输入的数据不正确,就会出现问题,比如说某人的生日是"2月30日"!那应该怎么样来检验暑假是否正确呢? 在PHP中加入了正则表达式的支持,让我们可以十分方便的进行数据匹配。<br />2 什么是正则表达式:<br />简单的说,正则表达式是一种可以用于模式匹配和
php 调用 perl,在PHP中使用与Perl兼容的正则表达式
前言PHP被大量的应用于Web的后台CGI开发,通常是在用户数据数据之后得出某种结果,但是如果用户输入的数据不正确,就会出现问题,比如说某人的生日是"2月30日"!那应该怎么样来检验暑假是否正确呢? 在PHP中加入了正则表达式的支持,让我们可以十分方便的进行数据匹配。什么是正则表达式简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到...
正则表达式(Perl兼容风格-PHP)小结
正则表达式(Perl兼容风格-PHP) 组成 1:定界符 反斜线为定界符,表达式放在两个/中间 例如:/a/ 2:原子字符 1:普通字符 2:非打印字符 字符和含义 : \cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。 \f
PHP中Perl兼容类型的正则表达式相关函数总结
由于POSIX扩展类型的正则表达式函数自5.3版本时就被取消了,所以这里只总结Perl兼容类型的。1、preg_grep(string 正则表达式,array 输入数组[,int 标识])返回值类型:数组返回值:返回输入数组中符合正则表达式的部分补充说明:第三个参数如果被设置为PREG_GREP_INVERT,将返回不匹配指定正则表达式的值程序实例:从指定数组中提取出网易公司的邮箱:2、preg_match(string 正则表达式, string 输入字符串[, array 输出数组的引用[,int 标识
PHP学习笔记:PERL兼容正则表达式
<br />PERL兼容正则可以使用任何不是字母、数字或反斜线(/)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[] 和 <> 作为定界符<br /> <br />模式修正符:修正符中的空格和换行被忽略,其它字符会导致错误。<br />i 如果设定此修正符,模式中的字符将同时匹配大小写字母。<br />m 当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(/n)的之后和之前。<br />s 如果设定
705



被折叠的 条评论
为什么被折叠?



