PHP 正则表达式自编.docx
《PHP 正则表达式自编.docx》由会员分享,可在线阅读,更多相关《PHP 正则表达式自编.docx(10页珍藏版)》请在冰豆网上搜索。
PHP正则表达式自编
PHP中的正则表达式
正则表达式就是用来匹配、替换、想要的字符,在PHP中采用了两种风格的“正则表达式”POSIX和Perl两种。
POSIX正则表达式是UnLx,linux中所采用正则表达式。
Perl是对POSIX进行了扩展,Perl要优于POSIX
POSIX正则表达式:
POSIX正则表达式中支持3种方法:
中括号、量词、预定义字符
1、[]中括号作用:
中括号的作用是选取一个字符范围。
其中以“-”指定连续字符。
“,”逗号用来指定间断字符。
如:
[0-9]任何0~9的十进制数字
[a-z]任何a~z的字母
[A-Za-z]任何从大写A至小写z字符。
2、量词:
指定匹配的“字符”出现的“位置、数量”等。
$
匹配输入字符串的结尾位置。
如果设置了RegExp对象的Multiline属性,则$也匹配'\n'或'\r'。
要匹配$字符本身,请使用\$。
()
标记一个子表达式的开始和结束位置。
子表达式可以获取供以后使用。
要匹配这些字符,请使用\(和\)。
[]
标记一个中括号表达式的开始。
要匹配[,请使用\[。
{}
标记限定符表达式的开始。
要匹配{,请使用\{。
*
匹配前面的子表达式零次或多次。
要匹配*字符,请使用\*。
+
匹配前面的子表达式一次或多次。
要匹配+字符,请使用\+。
.
匹配除换行符\n之外的任何单字符。
要匹配.,请使用\。
?
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
要匹配?
字符,请使用\?
。
\
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
例如,'n'匹配字符'n'。
'\n'匹配换行符。
序列'\\'匹配"\",而'\('则匹配"("。
^
匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。
要匹配^字符本身,请使用\^。
|
指明两项之间的一个选择。
要匹配|,请使用\|。
预定义字符
[[:
alpha:
]]任何大小写字母,相当于Perl中的[A-Za-z]
[[:
digit:
]]任何数字,相当于Perl中的[0-9]
[[:
alnum:
]]任何大小写字母和数字,相当于Perl中的[A-Za-z0-9]
[[:
space:
]]任何白字符,空格、换行、制表符、换页、回车
[[:
upper:
]]任何大写字母,相当于Perl中的[A-Z]
[[:
lower:
]]任何小写字母,相当于Perl中的[a-z]
[[:
punct:
]]任何标点符号
[[:
graph:
]]从ASCII33-126范围内的可打印字符。
SOPIX正则独有的
[[:
cntrl:
]]控制字符,如制表符,退格符或反斜线。
SOPIX正则独有的
[[:
xdigit:
]]任何16进制的数字,相当于Perl中的[0-9a-fA-F]
PHP中支持的POSIX风格函数有7个:
booleanereg(stringval,stringval2,[arrayregs])
ereg使用POSIX正则val中的值,以区分大小定的方式搜索val2中的值,再按正则表达式中圆括号()中的字表达式分别进行填充regs数组,如果有一个匹配就返回True。
如:
结果:
查到了
查到的内容是:
――――――――――――――――――――――――――――――――――
eregi()以不区分大小定的方式搜索,其它与ereg()相同
如:
结果显示:
没有查到
――――――――――――――――――――――――――――――――――
stringereg_replace(stringpattern,stringreplacement,stringstring)
以区分大小写的方式替换文本,pattern为要查的“正则表达式”,replacement为要怎样替换的“正则表达式”,string为“被查找文本”,最后再返回一个“替换结果”string值。
注意:
匹配的值也和ereg()方法一样分段,但这里使用\0
\1,\2……来分别引用,而不是数组索引。
如下:
显示结果:
baidu
url地址为:
baidu
―――――――――――――――――――――――――――――――――-
eregi_replace()
其使用和ereg_replace()方法一样,只是采用“不区分大小写的方式替换文本”
―――――――――――――――――――――――――――――――――
split(stringpattern,stringstring,intlmit)
split()是“以区分大小写的形式”通过“正则表达式(pattern)”查找字符文本(string),充当被查找文本中的分割符,将文本进行分割。
可以指定分割个数(lmit),进行分割。
如:
显示结果:
Array([0]=>www[1]=>)
――――――――――――――――――――――――――――――――――
spliti()
spliti()是“以不区分大小写的形式”通过“正则表达式(pattern)”查找字符文本(string),充当被查找文本中的分割符,将文本进行分割。
可以指定分割个数(lmit),进行分割。
――――――――――――――――――――――――――――――――――
sql_regcase()
字符文本中只要出现字母,函数将该字母转换成“正则表达式的大小写界限”。
如果PHP应用要与其它应用协作,而这些应用只支持区分大小写的正则表达式,可以使用这个函数作为工作区。
如:
显示结果:
[Ww][Ww][Ww].[Bb][Aa][Ii][Dd][Uu].[Cc][Oo][Mm]
―――――――――――――――――――――――――――――――――――――――
Perl正则表达式
Perl正则表达式,继承了POSIX正则表达式的上述语法,即:
中括号、量词、预定义字符,同时也添加了它独有的操作语法
:
修饰符、元字符。
Perl采用/[正则表达式]/的形式进行书写的。
修饰符:
通常,你可能希望调整正则表达式解释:
例如,可能希望告诉正则表达式完成不区分大小写的搜索,或忽略语法中注释。
这些调整称为“修饰符(modifier)”,修饰符对编写简洁短小的表达式大有帮助。
表9-1列出了一此需要特别注意的修饰符:
i
完成不区分大小写的搜索
g
查找所有出现(alloccurrences完成全局搜索)
m
将一个字符串为多行(m就表示(mulitiple))。
默认情况下,^和$字符匹配字符串的最开始和最末尾。
使用m修饰符将使^和$匹配字符串中每行的开始。
s
将一个字符串视为一行,忽略其中的所有换行符;它与m修饰符正好相反
x
忽略正则表达式中的空白和注释
u
第一次匹配后停止。
许多量词很“贪婪”,将尽可通地完成匹配,而不是在第一次匹配后停止。
利用这个修饰,可以让它们“不再贪婪”
如:
/wmd/i:
可以匹配WMD、wMD、WMd、wmd以及字符串wnd的任何其它大小写形式。
/taxation/gi:
由于不区分大小写,所以会找到单词“taxation”所有出现。
可以使用这个全局修饰符出现的总次数,或者结合替换特性用某个字符串替代模式的所有出现。
元字符
利用Perl正则表达式还可以做另一件有用的事情,这就是使用各种元字符来搜索匹配。
元字符(metacharacter)就是一个前面有反斜线的字母字符,表示某种特殊含义。
以下是一组有用的元字符。
\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是一个用四个十六进制数字表示的Unicode字符。
例如,\u00A9匹配版权符号(?
)。
PHP中的Perl函数
PHP中的perl拥有7个函数,和POSIX一样,但功能有差异。
包括:
preg_grep()搜索数组中的所有元素,反回由与某个模式匹配的所有元素组成的数组。
其形式为:
arraypreg_grep(stringpattern,arrayinput[,flags])
preg_grep()函数搜索数组中的所有元素,返回由与某个模式匹配的所有元素组成的数组。
Pattern是所编写的“正则表达式”,array是要搜索的“数组”,flag是一个可选参数,他接受一个PREG_REGP_IVNERT。
传递的标志将得到与该模式不匹配的数组元素。
实例:
显示结果:
Array([2]=>tow[3]=>three)
注意:
显示结果中的索引是[2]和[3]这和数组$arrNumber中的位置是对应的,它的数组大小也只有2
――――――――――――――――――――――――――――――――――
booleanpreg_match()(stringpattern,stringstring[,arraymatches])
preg_match()函数在字符串中搜索模式,如果存在则返回TRUE,否则返回FALS。
Pattern为“正则表达式”,string是被搜索的文本,matches为匹配的存储的数组。
如:
结果:
Array([0]=>evercreated!
[1]=>eve[2]=>created!
)
------------------------------------------------------------------------------------------------------
intpreg_match_all(stringpattern,stringstring,arraypattern_array,intorder)
preg_match_all()函数在字符串中匹配模式的所有出现,以便通过可选的输入参数order所指定的顺序,将每次出现放在某个数组中。
如:
结果:
8:
09,9:
407:
30
――――――――――――――――――――――――――――――――――――――――
stringpreg_quote(stringstr[,stringdelimiter])
函数preg_quote()在每个对于正则表达式语法而言有特殊的字符前插入一个反斜线。
这些特殊字符包括:
$^*()+{}[]|\\:
<>可以通过可选参数delimiter定指定用于正则表达式的定界符,使用它也要用反斜线转义。
如:
――――――――――――――――――――――――――――――
显示结果:
现在时间8\:
09,到了明天9\:
40有会议要7\:
30开
mixedpreg_replace(mixedpattern,mixedreplacement,stringstr|intlimit)
preg_replace()函数的作用是“替换模式的所有出现”,并返回修改后的结果。
Pattern为要按照要求的表达式,replacement为要按照要求替换的表达式,str为查找的文本,limit是一个可选的参数表示要进行多少次匹配,不设置和设置为-1表示替换所有出现的情况。
注意:
pattern和replacement可为一个数组类型。
如:
结果:
现在时间[],到了明天[]有会议要[]开
现在时间9:
00,到了明天6:
20有会议要12:
30开
―――――――――――――――――――――――――――――――――――――――――――
mixedpreg_replace_callback(mixedpattern,mixedfunction,stringstr|intlimit)
preg_replace_callback()函数要以通过别外函数返回值进行替换,在替换函数中可以对查找到的内容进行加工返回
显示结果:
现在时间8:
010,到了明天10:
40有会议要7:
30开
―――――――――――――――――――――――――――――――――――――――――
arraypreg_split(stringpattern,stringstr[,intlimit[,intflags]])
preg_split()函数“以不区分大小写的方式将字符串划分成不同元素。
Pattern为分割标识,str为搜索文本,limit为分割个数,flags为分割方式。
如:
显示结果:
Array([0]=>现在时间8:
09[1]=>到了明天9:
40[2]=>有会议要7:
30开)