在internet编程应用的时候,常常需要检查一个字符串是否"合法",这样的例子如qq必须是由数字组成,email的格式要正确,实现这样的验证,如果对每一个字符都进行检查,或者将每个字符和分隔符全部写出组成一个正则表达式,显然不是一个好办法。PHP提供了一种比较方便的定义一个字符集合的办法,这种集合,一般就称为字符簇,一般是用方括号[ ]把字符簇括起来.
首先,我们从最简单的例子开始。
[abde]
这个含有方括号的表达式就定义了一个字符簇,同时也是一个正则表达式。它的意思是,只要有一个字符串含有字符a,b,d,e中的任何一个,这个字符串就是匹配字符簇[abde]的。下面是一个例子
<?php
$str1="abmkaq2334fl";//字符串1
$str2="cffghki9-0";//字符串2
if(ereg("[abde]","$str1")){
echo"$str1 匹配 [abde]<br>";
}
else{
echo"$str1 不匹配 [abde]<br>";
}
if(ereg("[abde]","$str2")){
echo"$str2 匹配 [abde]";
}
else{
echo"$str2 不匹配 [abde]";
}
?>
我们得到的结果将是:
abmkaq2334fl 匹配 [abde]
cffghki9-0 不匹配 [abde]
下面给出一些常用的字符簇
[a-z] 匹配从a-z的字母,即匹配所有的小写字母
[A-Z] 匹配从A-Z的字母,即匹配所有的大写字母
因此
[a-zA-Z] 就是匹配所有的字母
这里只举一个简单的[a-z]的例子
<?php
$str1="abq2334fl";//字符串1
$str2="cffghki9-0";//字符串2
$pattern="[a-z]{5,}";//匹配模式
//判断是否含有连续的5个小写字母
if(ereg("$pattern","$str1")){
echo"$str1 匹配 $pattern<br>";
}
else{
echo"$str1 不匹配 $pattern<br>";
}
if(ereg("$pattern","$str2")){
echo"$str2 匹配 $pattern";
}
else{
echo"$str2 不匹配 $pattern";
}
?>
我们得到的结果将是
abq2334fl 不匹配 [a-z]{5,}
cffghki9-0 匹配 [a-z]{5,}
同样的,[0-9] 的意思是匹配所有的数字
<?php
$str1="abq2334fl";//字符串1
$pattern="[0-9]{5,}";//匹配模式
//判断是否含有连续的5个数字
if(ereg("$pattern","$str1")){
echo"$str1 匹配 $pattern<br>";
}
else{
echo"$str1 不匹配 $pattern<br>";
}
?>
得到的结果将是
abq2334fl 不匹配 [0-9]{5,}
另外,[ntrf] 匹配所有的空字符,包括换行符,tab,回车符(不含空格)
在方括号表达式内,使用字符"^"开头表示取非,即若含有其后的字符,则是不匹配的,否则是匹配的.
[^a-z] 匹配所有非小写字母
[^A-Z],[^0-9] 意思是一样的,匹配所有非大写字母,匹配所有非数字字符.
<?php
$str1="af";//字符串1
$pattern="[^a-z]";//匹配模式
//判断是否含有连续的5个小写字母
if(ereg("$pattern","$str1")){
echo"$str1 匹配 $pattern<br>";
}
else{
echo"$str1 不匹配 $pattern<br>";
}
?>
结果将是:
af 不匹配 [^a-z]
但是,字符串"afs555^^_",将是匹配的,因为其中含有了非小写字符
这里需要注意的是,^在[ ]里面和外面的作用是不一样的. ^[a-f]是指以a-f等六个字母中的一个开头的字符串匹配模式, [^a-f]则是匹配字符串中不是a-f等六个字母中的字符,也有这样的正则表达式^[^a-f] ,如果一个字符串不是以a-f开头的字符串,那么将是匹配的.
另外,特殊字符".",匹配除了新行之外的所有字符(.+)可以匹配除了空字符串和含一个新行字符的任何字符串.
除了上述的字符簇外,PHP还提供了一些内置的通用字符簇:
[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何数字和字母
[[:space:] 任何空白字符
[[:upper:]] 任何大字字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何十六进制的数字
[[:cntrl:]] 任何ASCII值小于32的字符
特别地,[".chr(0xa1)."-".chr(0xff)."]匹配所有的汉字,下面是一个例子
<?php
$str = "伊风网络phplover";
if (ereg("^[".chr(0xa1)."-".chr(0xff)."]+$", $str)){
echo "这是一个纯中文字符串";
}
else
{
echo "这不是一个纯中文字串";
}
?>
$str的值换成"伊风网络",得到的结果将是
这是一个纯中文字符串