php判断特殊字符,(转)PHP中的正规表达式/正则表达式中的特殊字符

PHP继承*NIX的一贯传统,完全支持正规表达式的处理。正规表达式提供了一种高级的,但不直观的字符串匹配和处理的方法。用过PERL的正规表达式的朋友都知道,正规表达式的功能非常强大,但学起来不是那么容易。比如:

^.+@.+\\..+$

这段有效却难以理解的代码足够使一些程序员头痛(我就是)或者让他们放弃使用正规表达式。相信当你读完这个教程后,就可以理解这段代码的含义了。

基本模式匹配

一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:

^once

这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串\\”once upon a time\\”匹配,与\\”There once was a man from NewYork\\”不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。

bucket$

这个模式与\\”Who kept all of this cash in a bucket\\”匹配,与\\”buckets\\”不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:

^bucket$

只匹配字符串\\”bucket\\”。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式

once

与字符串

There once was a man from NewYork

Who kept all of his cash in a bucket.

是匹配的。

在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠()打头。制表符的转义序列是:t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:

^t

类似的,用n表示“新行”,r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\\表示,句号.用.表示,以此类推。

字符簇

在INTERNET的程序中,正规表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。

所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:

[AaEeIiOoUu]

这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:

[a-z]

//匹配所有的小写字母

[A-Z]

//匹配所有的大写字母

[a-zA-Z]

//匹配所有的字母

[0-9]

//匹配所有的数字

[0-9.-]

//匹配所有的数字,句号和减号

[ frtn]

//匹配所有的白字符

同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如\\”z2\\”、\\”t6\\”或\\”g7\\”,但不是\\”ab2\\”、\\”r2d3\\” 或\\”b52\\”的话,用这个模式:

^[a-z][0-9]$

尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。

前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:

^[^0-9][0-9]$

这个模式与\\”&5\\”、\\”g7\\”及\\”-2\\”是匹配的,但与\\”12\\”、\\”66\\”是不匹配的。下面是几个排除特定字符的例子:

[^a-z]

//除了小写字母以外的所有字符

[^\\/^]

//除了\\”/\\”和\\”^\\”字符之外的所有字符

[^\\”\\\’]

//除了双引号(\\”)和单引号(\\\’)之外的所有字符

特殊字符\\”.\\” (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式\\”^.5$\\”与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式\\”.\\”可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。

PHP的正规表达式有一些内置的通用字符簇,列表如下:

字符簇

含义

[[:alpha:]]

任何字母

[[:digit:]]

任何数字

[[:alnum:]]

任何字母和数字

[[:space:]]

任何白字符

[[:upper:]]

任何大写字母

[[:lower:]]

任何小写字母

[[:punct:]]

任何标点符号

[[:xdigit:]]

任何16进制的数字,相当于[0-9a-fA-F]

确定重复出现

到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。

字符簇

含义

^[a-zA-Z_]$

所有的字母和下划线

^[[:alpha:]]{3}$

所有的3个字母的单词

^a$

字母a

^a{4}$

aaaa

^a{2,4}$

aa,aaa或aaaa

^a{1,3}$

a,aa或aaa

^a{2,}$

包含多于两个a的字符串

^a{2,}

如:aardvark和aaab,但apple不行

a{2,}

如:baad和aaa,但Nantucket不行

\\t{2}

两个制表符

.{2}

所有的两个字符

这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现x次”;一个数字加逗号,{x,}的意思是“前面的内容出现x或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现x次,但不超过y次”。我们可以把模式扩展到更多的单词或数字:

^[a-zA-Z0-9_]{1,}$

//所有包含一个以上的字母、数字或下划线的字符串

^[0-9]{1,}$

//所有的正数

^\\-{0,1}[0-9]{1,}$

//所有的整数

^\\-{0,1}[0-9]{0,}\\.{0,1}[0-9]{0,}$

//所有的小数

最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(\\-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一个可选的小数点(\\.{0,1})再跟上0个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。

特殊字符”?”与{0,1}是相等的,它们都代表着:“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为:

^\\-?[0-9]{0,}\\.?[0-9]{0,}$

特殊字符”*”与{0,}是相等的,它们都代表着“0个或多个前面的内容”。最后,字符”+”与 {1,}是相等的,表示“1个或多个前面的内容”,所以上面的4个例子可以写成:

^[a-zA-Z0-9_]+$

//所有包含一个以上的字母、数字或下划线的字符串

^[0-9]+$

//所有的正数

^\\-?[0-9]+$

//所有的整数

^\\-?[0-9]*\\.?[0-9]*$

//所有的小数

当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。

___________________________________________________________________________

字符/

意义:对于字符,通常表示按字面意义,指出接着的字符为特殊字符,不作解释。

例如:/b/匹配字符’b’,通过在b 前面加一个反斜杠,也就是/b/,则该字符变成特殊字符,表示

匹配一个单词的分界线。

或者:

对于几个字符,通常说明是特殊的,指出紧接着的字符不是特殊的,而应该按字面解释。

例如:*是一个特殊字符,匹配任意个字符(包括0个字符);例如:/a*/意味匹配0个或多个a。为了匹配字面上的*,在a前面加一个反斜杠;例如:/a*/匹配’a*’。

字符^

意义:表示匹配的字符必须在最前边。

例如:/^A/不匹配”an A,”中的’A’,但匹配”An A.”中最前面的’A’。

字符$

意义:与^类似,匹配最末的字符。

例如:/t$/不匹配”eater”中的’t’,但匹配”eat”中的’t’。

字符*

意义:匹配*前面的字符0次或n次。

例如:/bo*/匹配”A ghost booooed”中的’boooo’或”A bird warbled”中的’b’,但不匹配”Agoat grunted”中的任何字符。

字符+

意义:匹配+号前面的字符1次或n次。等价于{1,}。

例如:/a+/匹配”candy”中的’a’和”caaaaaaandy.”中的所有’a’。

字符?

意义:匹配?前面的字符0次或1次。

例如:/e?le?/匹配”angel”中的’el’和”angle.”中的’le’。

字符.

意义:(小数点)匹配除换行符外的所有单个的字符。

例如:/.n/匹配”nay, an apple is on the tree”中的’an’和’on’,但不匹配’nay’。

字符(x)

意义:匹配’x’并记录匹配的值。

例如:/(foo)/匹配和记录”foo bar.”中的’foo’。匹配子串能被结果数组中的素[1], …,[n] 返回,或被RegExp对象的属性, …, 返回。

字符x│y

意义:匹配’x’或者’y’。

例如:/green│red/匹配”green apple”中的’green’和”red apple.”中的’red’。

字符{ n }

意义:这里的n是一个正整数。匹配前面的n个字符。

例如:/a{ 2 }/不匹配”candy,”中的’a’,但匹配”caandy,” 中的所有’a’和”caaandy.”中前面的两个’a’。

字符{ n, }

意义:这里的n是一个正整数。匹配至少n个前面的字符。

例如:/a{ 2, }不匹配”candy”中的’a’,但匹配”caandy”中的所有’a’和”caaaaaaandy.”中的所有’a’

字符{ n,m }

意义:这里的n和m都是正整数。匹配至少n个最多m个前面的字符。

例如:/a{ 1,3 }/不匹配”cndy”中的任何字符,但匹配 “candy,”中的’a’,”caandy,” 中的前面两个\’a’和”caaaaaaandy”中前面的三个’a’,注意:即使”caaaaaaandy” 中有很多个’a’,但只匹配前面的三 个’a’即”aaa”。

字符[xyz]

意义:一字符列表,匹配列出中的任一字符。你可以通过连字符-指出一个字符范围。

例如:[abcd]跟[a-c]一样。它们匹配”brisket”中的’b’和”ache”中的’c’。

字符[^xyz]

意义:一字符补集,也就是说,它匹配除了列出的字符外的所有东西。 你可以使用连字符-指出一 字符范围。

例如:[^abc]和[^a-c]等价,它们最早匹配”brisket”中的’r’和”chop.”中的’h’。

字符

意义:匹配一个空格(不要与b混淆)

字符b

意义:匹配一个单词的分界线,比如一个空格(不要与混淆)

例如:/bnw/匹配”noonday”中的’no’,/wyb/匹配”possibly yesterday.”中的’ly’。

字符B

意义:匹配一个单词的非分界线

例如:/wBn/匹配”noonday”中的’on’,/yBw/匹配”possibly yesterday.”中的’ye’。

字符cX

意义:这里的X是一个控制字符。匹配一个字符串的控制字符。

例如:/cM/匹配一个字符串中的control-M。

字符d

意义:匹配一个数字,等价于[0-9]。

例如:/d/或/[0-9]/匹配”B2 is the suite number.”中的’2’。

字符D

意义:匹配任何的非数字,等价于[^0-9]。

例如:/D/或/[^0-9]/匹配”B2 is the suite number.”中的’B’。

字符f

意义:匹配一个表单符

字符n

意义:匹配一个换行符

字符r

意义:匹配一个回车符

字符s

意义:匹配一个单个white空格符,包括空格,tab,form feed,换行符,等价于[ fnrtv]。

例如:/sw*/匹配”foo bar.”中的’ bar’。

字符S

意义:匹配除white空格符以外的一个单个的字符,等价于[^ fnrtv]。

例如:/S/w*匹配”foo bar.”中的’foo’。

字符t

意义:匹配一个制表符

字符v

意义:匹配一个顶头制表符

字符w

意义:匹配所有的数字和字母以及下划线,等价于[A-Za-z0-9_]。

例如:/w/匹配”apple,”中的’a’,”.28,”中的’5’和”3D.”中的’3’。

字符W

意义:匹配除数字、字母外及下划线外的其它字符,等价于[^A-Za-z0-9_]。

例如:/W/或者/[^$A-Za-z0-9_]/匹配”50%.”中的’%’。

字符n

意义:这里的n是一个正整数。匹配一个正则表达式的最后一个子串的n的值(计数左圆括号)。

例如:/apple(,)sorange1/匹配”apple, orange, cherry, peach.”中的’apple, orange’,下面有一个更加完整的例子。

注意:如果左圆括号中的数字比n指定的数字还小,则n取下一行的八进制escape作为描述。

字符ooctal和xhex

意义:这里的ooctal是一个八进制的escape值,而xhex是一个十六进制的escape值,允许在一个正则表达式中嵌入ASCII码

附:下表是元字符及其在正则表达式上下文中的行为的一个完整列表:字符 描述将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。

'n' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。

^

匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘n’ 或 ‘r’ 之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘n’ 或 ‘r’ 之前的位置。

*

匹配前面的子表达式零次或多次。例如,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 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,

在JScript 中则使用 {CONTENT}… 属性。要匹配圆括号字符,请使用 ‘(’ 或 ‘)’。

(?:pattern)

匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合

一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。

(?=pattern)

正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后

使用。例如, ‘Windows (?=95|98|NT|2000)’ 能匹配 “Windows 2000″ 中的 “Windows” ,但不能匹配 “Windows 3.1″

中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从

包含预查的字符之后开始。

(?!pattern)

负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not

matching 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’ 范围内的任意字符。

b

匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘erb’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。

B

匹配非单词边界。’erB’ 能匹配 “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

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。

S

匹配任何非空白字符。等价于 [^ fnrtv]。

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 是一个正整数。对所获取的匹配的引用。例如,’(.)’ 匹配两个连续的相同字符。

n

标识一个八进制转义值或一个后向引用。如果 n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制

数字 (0-7),则 n 为一个八进制转义值。

nm

标识一个八进制转义值或一个后向引用。如果 nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为

后向引用。如果 nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均

为八进制数字 (0-7),则 nm 将匹配八进制转义值 nm。

nml

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

un

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值