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

技术教程2个月前发布 北陌
328 00

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

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}

m和n均为非负整数,其中n≤m。最少匹配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”;

}

?

© 版权声明

相关文章

暂无评论

none
暂无评论...