7.2 正则表达示中的原子
原子
原子是正则表达示里面的最小单位,原子说白了就是需要匹配的内容。一个成立的正则表达示当中必须最少要有一个原子。
所有可见不可见的字符就是原子
说明:我们见到的空格、回车、换行、0-9、A-Za-z、中文、标点符号、特殊符号全为原子。
在做原子的实例前我们先来讲解一个函数,preg_match:
int preg_match ( string $正则 , string $字符串 [, array &$结果] )
功能:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。
注:上面是preg_match常用的主要几个参数。我在上面将另外几个参数没有列出来。因为,另外两个参数太不常用了。
我们来通过实验来证明:
<?php
//定义一个变量叫zz,放正则表达示。为了方便大家记忆,如果你英文比较ok,建议把变量名还是写成英文的$pattern。
<?php
$zz = "/a/";
$string = "ddfdjjvi2jfvkwkfi24";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
因为我希望的是匹配a,而$string当是是不存在a的,所以不成功。
<?php
$zz = "/wq/";
$string = "ssssswqaaaaaa";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
上面的字符串中s后存在wq,因此匹配成功。
接下来我们匹配一个空格试试:
<?php
$zz = "/ /";
$string = "sssssw aaaaa";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
执行结果如下:
因上,$string这个变量的w字符后存在一个空格。所以匹配成功,输出了字符串类型,长度为1。只不过我们的肉眼不可见,看不到这个字符串而已。
特殊标识的原子
原子 | 说明 |
---|---|
d | 匹配一个0-9 |
D | 除了0-9以外的所有字符 |
w | a-zA-Z0-9_ |
W | 除了0-9A-Za-z_以外的所有字符 |
s | 匹配所有空白字符 空格 |
S | 匹配所有非空白字符 |
[ ] | 指定范围的原子 |
这个个需要记住,最好达到默写级别。记忆的时候成对记忆,d是匹配一个0-9,那么D 就是除了0-9以外的所有字符。
上面已经说明的很清楚了,我们进行实验一步一步对这些进行学习。
请你在学习的时候,对于这些原子务必达到默写级别。因为,我们以后做实验的时候,一点一点你就学会了。
d匹配一个0-9
<?php
$zz = "/d/";
$string = "我爱喝9你爱不爱喝";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
D匹配一个非0-9的值
<?php
$zz = "/D/";
$string = "121243中23453453";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
匹配成功,匹配到了中。因为它不是0-9之间的字符。
w匹配一个a-zA-Z0-9_
<?php
$zz = "/w/";
$string = "新中_国万岁呀万岁";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
匹配成功,匹配到了下划线。
W匹配一个非a-zA-Z0-9_
<?php
$zz = "/w/";
$string = "afasABCWEQR44231284737";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
匹配失败。因为,上面上面全是a-zA-Z0-9,没有非a-zA-Z0-9。
s 匹配所有空白字符 空格
<?php
$zz = "/s/";
$string = "中国万
岁";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
匹配成功,因为有一个回车。
S 非空字符
<?php
$zz = "/s/";
$string = "
a ";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
匹配成功。虽然上面有空格,回车和缩进。但是,有一个非空白字符a。因此,匹配成功。
[] 指定范围的原子
<?php
$zz = "/[0-5]w+/";
$string = "6a";
$string1 = "1C";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
结论:
上例中0-5匹配$string失败,而$string1成功。因为,$string中的第一个数值为6,不在[0-5]的范围之内。
<?php
$zz = "/[a-zA-Z0-9_]w/";
$string = "ab";
$string1 = "9A";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
结论:
$string和$string1都匹配成功。因为w就是[a-zA-Z0-9_]
<?php
$zz = "/[abc]d+/";
$string = "a9";
$string1 = "b1";
$string2 = "c5";
$string3 = "d4";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
结论:
$string、$string1、$string2匹配成功,而$string3不成功。因为$string3超过了[abc]的范围,它是从d开始的。
[^ 字符] 不匹配指定区间的字符
<?php
$zz = "/[^0-9A-Za-z_]/";
$string = "aaaaab311dd";
$string1 = "!$@!#%$#^##";
if(preg_match($zz, $string, $matches)){
echo "匹配到了,结果为:";
var_dump($matches);
}else{
echo "没有匹配到";
}
?>
结论:
- 匹配$string不成功,但是匹配$string1的时候成功。因为中括号里面有个抑扬符。
- ^ 抑扬符在中括号里面的作用是不准以中括号里面的字符进行匹配。
总结:
原子 | 等价式 |
---|---|
w | [a-zA-Z0-9_] |
W | [^a-zA-Z0-9_] |
d | [0-9] |
D | [^0-9] |
s | [ f ] |
S | [^ f ] |