php 正規表示示中的原子
原子
原子是正則表達示裡面的最小單位,原子說白了就是需要匹配的內容。一個成立的正規表示示當中必須最少要有一個原子。
所有可見不可見的字元就是原子
說明:我們見到的空格、回車、換行、0-9、A-Za-z、中文、標點符號、特殊符號全為原子。
在做原子的實例前我們先來講解一個函數,preg_match:
int preg_match ( string $正規, string $字串[, array &$結果] )
功能:根據$正規變數,符合$字串變數。如果存在則回傳符合的個數,把符合的結果放到$結果變數裡。如果沒有符合到結果回傳0。
註:上面是preg_match常用的主要幾個參數。我在上面將另外幾個參數沒有列出來。因為,另外兩個參數太不常用了。
我們來用實驗證明:
<?php
//定义一个变量叫zz,放正则表达示。为了方便大家记忆,如果你英文比较ok,建议把变量名还是写成英文的$pattern。
$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 | 符合所有空白字元\n \t \r 空格 |
| \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 匹配所有空白字元\n \t \r 空格
#<?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 '没有匹配到';
}
?>結論:
1.符合$string不成功,但是匹配$string1的時候成功。因為中括號裡面有個抑揚符。
2.^ 抑揚符在中括號裡面的作用是不准以中括號裡面的字元進行配對。
總結:
| 原子 | 等價式 |
|---|---|
| \w | [a-zA-Z0-9_] |
| #\W | [^a-zA-Z0-9_] |
| \d | [0-9] |
| #\D | [^0-9] |
| \s | [ \t\n\f\r] |
| #\S | ##[^ \ t\n\f\r]


