首页 后端开发 php教程 第4章 数据处理-php正则表达式-郑阿奇(续)_PHP教程

第4章 数据处理-php正则表达式-郑阿奇(续)_PHP教程

Jul 21, 2016 pm 03:26 PM
含义 基础知识 字符 数据处理 通常 正则 表达式

1.正则表达式基础知识
含义:由普通字符和(a-z)和一些特殊字符组成的字符串模式
功能:有效性验证。
替换文本。
从一个字符串提取一个子字符串。
分类:POSIX和Perl
POSIX风格更容易掌握,但不能用于二进制模式,而perl相对比较复杂。
2.POSIX风格的正则表达式
1.编写正则表达式
表4.3 POSIX正则表达式语法格式列表

字 符

描 述

\

转义字符,用于转义特殊字符。例如,'.'匹配单个字符,'\.'匹配一个点号。'\-'匹配连字符'-','\\'匹配符号'\'

^

匹配输入字符串的开始位置。例如'^he'表示以'he'开头的字符串

$

匹配输入字符串的结束位置。例如,'ok$'表示以'ok'结尾的字符串

*

匹配前面的子表达式零次或多次。例如,'zo*'能匹配"z"以及"zoo"。*等价于{0,}

+

匹配前面的子表达式一次或多次。例如,'zo+'能匹配"zo"以及"zoo",但不能匹配"z"。+等价于{1,}

?

匹配前面的子表达式零次或一次。例如,'do(es)?'可以匹配"do"或"does"中的"do"。'?'等价于{0,1}

{n}

n是一个非负整数。匹配确定的n次。例如,'o{2}'不能匹配"Bob"中的'o',但是能匹配"food" 中的两个'o'

{n,}

n是一个非负整数。至少匹配n次。例如,'o{2,}'不能匹配"Bob"中的'o',但能匹配"foooood" 中的所有'o'。'o{1,}'等价于'o+'。'o{0,}'则等价于'o*'

{n,m}

mn均为非负整数,其中nm。最少匹配n次且最多匹配m次。例如,"o{1,3}"将匹配"fooooood"中的前三个'o'。'o{0,1}'等价于'o?'。请注意在逗号和两个数之间不能有空格

?

当该字符紧跟在任何一个其他限制符(*, +, ?, {n}, {n,}, {n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。例如,对于字符串"oooo",'o+?'将匹配单个"o",而'o+' 将匹配所有'o'

.

匹配除"\n"之外的任何单个字符,要匹配包括'\n' 在内的任何字符,可以使用'[.\n]'的模式

(pattern)

匹配pattern并获取这一匹配。所获取的匹配保存到相应的数组中。要匹配圆括号字符,请使用 '\(' 或 '\)'

(?:pattern)

匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储。这在使用"或"|"来组合一个模式的各个部分时很有用。例如,'industr(?:y|ies).就是一个比'industry|industries'更简略的表达式

(?=pattern)

正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows(?=95|98|NT|2000)'能匹配"Windows 2000"中的"Windows",但不能匹配"Windows 3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

(?!pattern)

负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows(?!95|98|NT|2000)'能匹配"'Windows 3.1"中的"Windows",但不能匹配"Windows 2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

x|y

匹配x或y。例如,'z|food' 能匹配"z"或"food",'(z|f)ood'则匹配"zood"或"food"

[xyz]

字符集合。匹配所包含的任意一个字符。例如,'[abc]'可以匹配"plain"中的'a'

[^xyz]

负值字符集合。匹配未包含的任意字符。例如,'[^abc]'可以匹配"plain"中的'p'

[a-z]

字符范围。匹配指定范围内的任意字符。例如,'[a-z]'可以匹配'a'到'z' 范围内的任意小写字母字符

[^a-z]

负值字符范围。匹配不在指定范围内的任意字符。例如,'[^a-z]'可以匹配不在'a' 到'z'范围内的任意字符

以下是几个简单的正则表达式的例子:
●'[A-Za-z0-9] ':表示所有的大写字母、小写字母及0到9的数字。
●'^hello':表示以hello开始的字符串。
●'world$':表示以world结尾的字符串。
●'.at':表示以除"\n"外的任意单个字符开头并以"at"结尾的字符串,如"cat"、"nat"等。
●'^[a-zA-Z]':表示一个以字母开头的字符串。
●'hi{2}':表示字母h后跟着两个i即hii。
●'(go)+':表示至少含有一个'go'字符串的字符串,如'gogo'
身份证号码一般由18位数字或17位数字后面加一个X或Y字母组成,要匹配身份证号码,可以写作:
^[0-9]{17}([0-9]|X|Y)$
Email地址的正则表达式可以写作:
^[a-zA-Z0-9\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$
2.字符串的匹配
ereg()和eregi()函数
使用ereg()函数可以查找字符串与子字符串匹配的情况,并返回匹配字符串的长度,还可以借助参数返回匹配字符的数组。语法格式如下:
int ereg(string ($pattern) , string $string [, array $regs ])
复制代码 代码如下:

/*本例检查字符串是否是ISO格式的日期(YYYY-MM-DD) */
$date="1988-08-09";
$len=ereg ('([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})', $date, $regs);//日期格式为YYYY-MM-DD
if ($len)
{
echo "$regs[3].$regs[2].$regs[1]". "
"; //输出"09.08.1988"
echo $regs[0] ."
"; //输出"1988-08-09"
echo $len; //输出10
}
else
{
echo "错误的日期格式: $date";
}
?>

3.字符串的替换
ereg_replace()函数语法格式如下:
string ereg_replace(string $pattern , string $replacement , string $string)
说明:函数使用字符串$replacement替换字符串$string中与$pattern匹配的部分,并返回替换后的字符串。若未找到匹配项,则原样返回
复制代码 代码如下:

$str="hello world";
echo ereg_replace('[aeo]', 'x',$str). "
"; //输出'hxllx wxrld'
$res='hello';
echo ereg_replace('hello', $res,$str); //使用超链接替换'hello'
?>

4.分割数组

使用split()函数可以完成与explode()函数一样的功能,而且可以根据给出的正则表达式来分割字符串,并返回一个数组。语法格式如下:

array split(string $pattern , string $string [, int $limit ])

5.产生正则表达式

3.Perl兼容的正则表达式

1.编写正则表达式

表4.4 Perl兼容正则表达式扩充的语法格式

字 符

描 述

\b

匹配一个单词边界,也就是指单词和空格间的位置。例如,'er\b'可以匹配"never"中的 'er',但不能匹配"verb"中的'er'

\B

匹配非单词边界。'er\B'能匹配"verb"中的'er',但不能匹配"never"中的'er'

\cx

匹配由x指明的控制字符。例如,'\cM'匹配一个Control-M或回车符。x的值必须为A~Z或a~z之一。否则,将'c'视为一个原义的'c'字符

\d

匹配一个数字字符。等价于'[0-9]'

\D

匹配一个非数字字符。等价于'[^0-9]'

\f

匹配一个换页符。等价于'\x0c'和'\cL'

\n

匹配一个换行符。等价于'\x0a'和'\cJ'

\r

匹配一个回车符。等价于'\x0d'和'\cM'

\s

匹配任何空白字符,包括空格、制表符、换页符等。等价于' [ \f\n\r\t\v] '

\S

匹配任何非空白字符。等价于' [^ \f\n\r\t\v] '

\t

匹配一个制表符。等价于'\x09'和'\cI'

\v

匹配一个垂直制表符。等价于'\x0b'和'\cK'

\w

匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'

\W

匹配任何非单词字符,等价于'[^A-Za-z0-9_]'

\xn

匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配"A"。'\x041'则等价于'\x04' & "1"。正则表达式中可以使用ASCII编码

\num

匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,'(.)\1'匹配两个连续的相同字符

\n

标志一个八进制转义值或一个后向引用。如果\n之前至少有n个获取得子表达式,则n为后向引用。否则,如果n为八进制数字(0~7),则n为一个八进制转义值

\nm

标志一个八进制转义值或一个后向引用。如果\nm之前至少有nm个获取得子表达式,则 nm为后向引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的后向引用。如果前面的条件都不满足,若 n和m均为八进制数字(0~7),则\nm将匹配八进制转义值nm

\nml

如果n为八进制数字(0~3),且m和l均为八进制数字(0~7),则匹配八进制转义值nml

\un

匹配n,其中n是用4个十六进制数字表示的Unicode字符。例如,'\u00A9'匹配版权符号(©)

2.字符串匹配
preg_match()函数进行字符串的查找,语法格式如下:
int preg_match(string $pattern , string $subject [, array $matches [, int $flags ]])
说明:该函数的结构与ereg()函数类似,在$subject字符串中搜索与$pattern给出的正则表达式相匹配的内容。
preg_match()函数返回$pattern所匹配的次数。不是0次(没有匹配)就是1次,因为preg_match()函数在第一次匹配之后将停止搜索
还有一个是preg_match_all(),从第一个匹配的末尾开始继续搜索,直到搜索完整个字符串。
preg_match_all()函数参数$flags的值可以取以下三种:
●PREG_PATTERN_ORDER。默认项,表示$matches[0]为全部模式匹配的数组,
$matches[1]为第一个括号中的子模式所匹配的字符串组成的数组,以此类推。
●PREG_SET_ORDER。如果设定此标记,则$matches[0]为第一组匹配项的数组,$matches[1]为第二组匹配项的数组,以此类推。
●PREG_OFFSET_CAPTURE。PREG_OFFSET_CAPTURE可以和其他两个标记组合使用,
如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。
3.字符串的替换
使用preg_replace()函数能够完成与函数ereg_replace()相同的功能,在字符串中查找匹配的子字符串,并用指定字符串替换子字符串。
语法格式如下:
mixed preg_replace(mixed $pattern , mixed $replacement , mixed $subject [, int $limit ])
4.字符串的分割
preg_split()函数可以使用正则表达式作为边界分割一个字符串,并将子字符串存入一个数组返回,作用与split()函数类似。
语法格式如下:
array preg_split(string $pattern , string $subject [, int $limit [, int $flags ]])
说明:本函数区分大小写,返回一个数组,数组包含$subject中沿着与$pattern匹配的边界所分割的子串。
$limit是可选参数,如果指定则最多返回$limit个字串,如果省略或为-1,则没有限制。
$flags的值可以是以下三种:
●PREG_SPLIT_NO_EMPTY。如果设定本标记,则函数只返回非空的字符串。
●PREG_SPLIT_DELIM_CAPTURE。如果设定本标记,定界符模式中的括号表达式的匹配项也会被捕获并返回。
PREG_SPLIT_OFFSET_CAPTURE。如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。
4.3实例-验证表单内容
【例4.4】 使用正则表达式验证用户输入的表单内容是否满足格式要求。
新建EX4_4_Hpage.php文件,输入以下代码。
复制代码 代码如下:

include 'EX4_4_Hpage.php'; //包含文件EX4_4Hpage.php
$id=$_POST['ID'];
$pwd=$_POST['PWD'];
$phone=$_POST['PHONE'];
$Email=$_POST['EMAIL'];
$checkid=preg_match('/^\w{1,10}$/',$id); //检查字符串是否在10个字符以内
$checkpwd=preg_match('/^\d{4,14}$/',$pwd); //检查是否在4~14个数字之间
$checkphone=preg_match('/^1\d{10}$/',$phone); //检查是否是以1开头的11位数字
//检查Email地址的合法性
$checkEmail=preg_match('/^[a-zA-Z0-9_\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/',$Email);
if($checkid&&$checkpwd&&$checkphone&&$checkEmail) //如果都为1,则注册成功
echo "注册成功!";
else
echo "注册失败,格式不对";
?>

新建EX4_4_Ppage.php文件,输入以下代码:
2.字符串匹配
preg_match()函数进行字符串的查找,语法格式如下:
int preg_match(string $pattern , string $subject [, array $matches [, int $flags ]])
说明:该函数的结构与ereg()函数类似,在$subject字符串中搜索与$pattern给出的正则表达式相匹配的内容。
preg_match()函数返回$pattern所匹配的次数。不是0次(没有匹配)就是1次,因为preg_match()函数在第一次匹配之后将停止搜索
还有一个是preg_match_all(),从第一个匹配的末尾开始继续搜索,直到搜索完整个字符串。
preg_match_all()函数参数$flags的值可以取以下三种:
●PREG_PATTERN_ORDER。默认项,表示$matches[0]为全部模式匹配的数组,
$matches[1]为第一个括号中的子模式所匹配的字符串组成的数组,以此类推。
●PREG_SET_ORDER。如果设定此标记,则$matches[0]为第一组匹配项的数组,$matches[1]为第二组匹配项的数组,以此类推。
●PREG_OFFSET_CAPTURE。PREG_OFFSET_CAPTURE可以和其他两个标记组合使用,
如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。
3.字符串的替换
使用preg_replace()函数能够完成与函数ereg_replace()相同的功能,在字符串中查找匹配的子字符串,并用指定字符串替换子字符串。
语法格式如下:
mixed preg_replace(mixed $pattern , mixed $replacement , mixed $subject [, int $limit ])
4.字符串的分割
preg_split()函数可以使用正则表达式作为边界分割一个字符串,并将子字符串存入一个数组返回,作用与split()函数类似。
语法格式如下:
array preg_split(string $pattern , string $subject [, int $limit [, int $flags ]])
说明:本函数区分大小写,返回一个数组,数组包含$subject中沿着与$pattern匹配的边界所分割的子串。
$limit是可选参数,如果指定则最多返回$limit个字串,如果省略或为-1,则没有限制。
$flags的值可以是以下三种:
●PREG_SPLIT_NO_EMPTY。如果设定本标记,则函数只返回非空的字符串。
●PREG_SPLIT_DELIM_CAPTURE。如果设定本标记,定界符模式中的括号表达式的匹配项也会被捕获并返回。
PREG_SPLIT_OFFSET_CAPTURE。如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。
4.3实例-验证表单内容
【例4.4】 使用正则表达式验证用户输入的表单内容是否满足格式要求。
新建EX4_4_Hpage.php文件,输入以下代码。
复制代码 代码如下:

include 'EX4_4_Hpage.php'; //包含文件EX4_4Hpage.php
$id=$_POST['ID'];
$pwd=$_POST['PWD'];
$phone=$_POST['PHONE'];
$Email=$_POST['EMAIL'];
$checkid=preg_match('/^\w{1,10}$/',$id); //检查字符串是否在10个字符以内
$checkpwd=preg_match('/^\d{4,14}$/',$pwd); //检查是否在4~14个数字之间
$checkphone=preg_match('/^1\d{10}$/',$phone); //检查是否是以1开头的11位数字
//检查Email地址的合法性
$checkEmail=preg_match('/^[a-zA-Z0-9_\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/',$Email);
if($checkid&&$checkpwd&&$checkphone&&$checkEmail) //如果都为1,则注册成功
echo "注册成功!";
else
echo "注册失败,格式不对";
?>

新建EX4_4_Ppage.php文件,输入以下代码:
复制代码 代码如下:

include 'EX4_4_Hpage.php'; //包含文件EX4_4Hpage.php
$id=$_POST['ID'];
$pwd=$_POST['PWD'];
$phone=$_POST['PHONE'];
$Email=$_POST['EMAIL'];
$checkid=preg_match('/^\w{1,10}$/',$id); //检查字符串是否在10个字符以内
$checkpwd=preg_match('/^\d{4,14}$/',$pwd); //检查是否在4-14个字符之间
$checkphone=preg_match('/^1\d{10}$/',$phone); //检查是否是以1开头的11位数子
//检查Email地址的合法性
$checkEmail=preg_match('/^[a-zA-Z0-9_\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/',$Email);
if($checkid&&$checkpwd&&$checkphone&&$checkEmail) //如果都为1,则注册成功
echo "注册成功!";
else
echo "注册失败,格式不对";
?>

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/323889.htmlTechArticle1.正则表达式基础知识 含义:由普通字符和(a-z)和一些特殊字符组成的字符串模式 功能:有效性验证。 替换文本。 从一个字符串提取一个...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

WICC币是什么? WICC币是什么? Feb 21, 2024 pm 06:00 PM

WICC币是什么?WICC币是WaykiChainCoin的简称,是基于区块链技术的数字货币。WaykiChain作为一条高效、可扩展和安全的公链,致力于为企业和开发者提供完善的区块链基础设施和创新工具。作为WaykiChain生态系统的核心代币,WICC币在平台上扮演着重要角色。WICC币的特点1.安全可靠:WaykiChain采用DPoS共识算法,具备可靠的分布式锁定机制和共识机制,保证了网络的高度安全性。2.高效可扩展:WaykiChain具备毫秒级的交易确认速度,每秒可处理数千笔交易,并

了解PHP中eol的含义 了解PHP中eol的含义 Mar 20, 2024 am 11:09 AM

深入了解PHP中eol的含义及代码示例在PHP编程中,eol是一个常见的术语,代表着"EndOfLine",即行尾。在不同操作系统中,行尾的表示方式可能不同,这就引出了eol的概念。在Windows系统中,一行的结束由回车符()和换行符()组成,即"";而在Unix/Linux系统中,行尾只由换行符()表示,即""。这样的差异可能会导致在不同操作系统

怎么关闭快手私信显示内容功能?关闭快手私信显示内容什么意思? 怎么关闭快手私信显示内容功能?关闭快手私信显示内容什么意思? Mar 21, 2024 pm 05:41 PM

作为国内领先的短视频平台,快手拥有大量用户,私信功能是用户之间互动的重要渠道。然而,一些用户可能觉得私信显示内容的功能让他们感到困扰,他们希望能够有选择地关闭这个功能。一、怎么关闭快手私信显示内容功能?1.打开快手应用,登录个人账号。2.进入快手主界面,点击右下角的“我的”按钮,进入个人中心。3.在个人中心页面,点击头像,进入个人设置。4.在个人设置页面,找到“隐私设置”选项,点击进入。5.在隐私设置页面,找到“私信显示内容”选项,点击进入。6.在私信显示内容设置页面,关闭“私信显示内容”功能的

详解 MySQL 主机名的含义 详解 MySQL 主机名的含义 Mar 01, 2024 pm 12:03 PM

MySQL主机名的含义及具体用法MySQL是一种流行的开源关系型数据库管理系统,被广泛应用于各种web应用程序中。在MySQL中,主机名是一个重要的概念,它用来指定连接到数据库服务器的主机的名称。在本文中,我们将详细解释MySQL主机名的含义,以及如何在实际开发中使用它。MySQL主机名的含义:在MySQL中,主机名是用来指定允许连接到

如何用 Golang 正则匹配多个单词或字符串? 如何用 Golang 正则匹配多个单词或字符串? May 31, 2024 am 10:32 AM

Golang正则表达式使用管道符|来匹配多个单词或字符串,将各个选项作为逻辑OR表达式分隔开来。例如:匹配"fox"或"dog":fox|dog匹配"quick"、"brown"或"lazy":(quick|brown|lazy)匹配"Go"、"Python"或"Java":Go|Python|Java匹配单词或4位邮政编码:([a-zA

使用Redis提升Laravel应用的数据处理效率 使用Redis提升Laravel应用的数据处理效率 Mar 06, 2024 pm 03:45 PM

使用Redis提升Laravel应用的数据处理效率随着互联网应用的不断发展,数据处理效率成为了开发者们关注的重点之一。在开发基于Laravel框架的应用时,我们可以借助Redis来提升数据处理效率,实现数据的快速访问和缓存。本文将介绍如何使用Redis在Laravel应用中进行数据处理,并提供具体的代码示例。一、Redis简介Redis是一种高性能的内存数据

Golang如何提升数据处理效率? Golang如何提升数据处理效率? May 08, 2024 pm 06:03 PM

Golang通过并发性、高效内存管理、原生数据结构和丰富的第三方库,提升数据处理效率。具体优势包括:并行处理:协程支持同时执行多个任务。高效内存管理:垃圾回收机制自动管理内存。高效数据结构:切片、映射和通道等数据结构快速访问和处理数据。第三方库:涵盖fasthttp和x/text等各种数据处理库。

Laravel 和 CodeIgniter 中数据处理能力的比较如何? Laravel 和 CodeIgniter 中数据处理能力的比较如何? Jun 01, 2024 pm 01:34 PM

比较Laravel和CodeIgniter的数据处理能力:ORM:Laravel使用EloquentORM,提供类对象关系映射,而CodeIgniter使用ActiveRecord,将数据库模型表示为PHP类的子类。查询构建器:Laravel具有灵活的链式查询API,而CodeIgniter的查询构建器更简单,基于数组。数据验证:Laravel提供了一个Validator类,支持自定义验证规则,而CodeIgniter的验证功能内置较少,需要手动编码自定义规则。实战案例:用户注册示例展示了Lar

See all articles