php 正規(guī)表示示中的原子
原子
原子是正則表達(dá)示裡面的最小單位,原子說(shuō)白了就是需要匹配的內(nèi)容。一個(gè)成立的正規(guī)表示示當(dāng)中必須最少要有一個(gè)原子。
所有可見(jiàn)不可見(jiàn)的字元就是原子
說(shuō)明:我們見(jiàn)到的空格、回車(chē)、換行、0-9、A-Za-z、中文、標(biāo)點(diǎn)符號(hào)、特殊符號(hào)全為原子。
在做原子的實(shí)例前我們先來(lái)講解一個(gè)函數(shù),preg_match:
int preg_match ( string $正規(guī), string $字串[, array &$結(jié)果] )
功能:根據(jù)$正規(guī)變數(shù),符合$字串變數(shù)。如果存在則回傳符合的個(gè)數(shù),把符合的結(jié)果放到$結(jié)果變數(shù)裡。如果沒(méi)有符合到結(jié)果回傳0。
註:上面是preg_match常用的主要幾個(gè)參數(shù)。我在上面將另外幾個(gè)參數(shù)沒(méi)有列出來(lái)。因?yàn)?,另外兩個(gè)參數(shù)太不常用了。
我們來(lái)用實(shí)驗(yàn)證明:
<?php //定義一個(gè)變量叫zz,放正則表達(dá)示。為了方便大家記憶,如果你英文比較ok,建議把變量名還是寫(xiě)成英文的$pattern。 $zz = '/a/'; $string = 'ddfdjjvi2jfvkwkfi24'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
因?yàn)槲蚁M氖瞧ヅ鋋,而$string當(dāng)是不存在a的,所以不成功。
<?php $zz = '/wq/'; $string = 'ssssswqaaaaaa'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
上面的字串中s後面存在wq,因此匹配成功。
接下來(lái)我們匹配一個(gè)空格試試:
<?php $zz = '/ /'; $string = 'sssssw aaaaa'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
執(zhí)行結(jié)果如下:
#因上,$string這個(gè)變數(shù)的w字符後面存在一個(gè)空格。所以匹配成功,輸出了字串類(lèi)型,長(zhǎng)度為1。只不過(guò)我們的肉眼不可見(jiàn),看不到這個(gè)字串而已。
特殊標(biāo)識(shí)的原子
#原子 | |
---|---|
#\d | 符合一個(gè)0-9 |
#\D | 除了0-9以外的所有字元 |
\w | a-zA-Z0-9_ |
\W | 除了0-9A-Za-z_以外的所有字元 |
\s | 符合所有空白字元\n \t \r 空格 |
\S | 符合所有非空白字元 |
[ ] | 指定範(fàn)圍的原子 |
這個(gè)個(gè)需要記住,最好達(dá)到默寫(xiě)等級(jí)。記憶的時(shí)候成對(duì)記憶,\d是匹配一個(gè)0-9,那麼\D 就是除了0-9以外的所有字元。
上面已經(jīng)說(shuō)明的很清楚了,我們進(jìn)行實(shí)驗(yàn)一步一步對(duì)這些進(jìn)行學(xué)習(xí)。
請(qǐng)你在學(xué)習(xí)的時(shí)候,對(duì)於這些原子務(wù)必達(dá)到默寫(xiě)等級(jí)。因?yàn)椋覀円葬嶙鰧?shí)驗(yàn)的時(shí)候,一點(diǎn)一點(diǎn)你就學(xué)會(huì)了。
\d符合一個(gè)0-9
<?php $zz = '/\d/'; $string = '我愛(ài)喝9你愛(ài)不愛(ài)喝'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
\D符合一個(gè)非0-9的值
<?php $zz = '/\D/'; $string = '121243中23453453'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
匹配成功,配對(duì)到了中。因?yàn)樗皇?-9之間的字元。
\w符合一個(gè)a-zA-Z0-9_
#<?php $zz = '/\w/'; $string = '新中_國(guó)萬(wàn)歲呀萬(wàn)歲'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
匹配成功,配對(duì)到了底線。
\W符合一個(gè)非a-zA-Z0-9_
#<?php $zz = '/\w/'; $string = 'afasABCWEQR44231284737'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
符合失敗。因?yàn)?,上面上面全是a-zA-Z0-9_,沒(méi)有非a-zA-Z0-9_。
\s 匹配所有空白字元\n \t \r 空格
#<?php $zz = '/\s/'; $string = "中國(guó)萬(wàn) 歲"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
匹配成功,因?yàn)橛幸粋€(gè)回車(chē)。
\S 非空字元
<?php $zz = '/\s/'; $string = " a "; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
匹配成功。雖然上面有空格,回車(chē)和縮排。但是,有一個(gè)非空白字元a。因此,匹配成功。
[] 指定範(fàn)圍的原子
<?php $zz = '/[0-5]\w+/'; $string = '6a'; $string1 = '1C'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
結(jié)論:
上例中0-5符合$string失敗,而$string1成功。因?yàn)椋?string中的第一個(gè)數(shù)值為6,不在[0-5]的範(fàn)圍內(nèi)。
<?php $zz = '/[a-zA-Z0-9_]\w/'; $string = 'ab'; $string1 = '9A'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
結(jié)論:
$string和$string1都符合成功。因?yàn)閈w就是[a-zA-Z0-9_]
<?php $zz = '/[abc]\d+/'; $string = 'a9'; $string1 = 'b1'; $string2 = 'c5'; $string3 = 'd4'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
結(jié)論:
$string、$string1、$string2配對(duì)成功,而$string3不成功。因?yàn)?string3超過(guò)了[abc]的範(fàn)圍,它是從d開(kāi)始的。
[^ 字元] 不符合指定區(qū)間的字元
<?php $zz = '/[^0-9A-Za-z_]/'; $string = 'aaaaab311dd'; $string1 = '!$@!#%$#^##'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒(méi)有匹配到'; } ?>
結(jié)論:
????1.符合$string不成功,但是匹配$string1的時(shí)候成功。因?yàn)橹欣ㄌ?hào)裡面有個(gè)抑揚(yáng)符。
????2.^ 抑揚(yáng)符在中括號(hào)裡面的作用是不準(zhǔn)以中括號(hào)裡面的字元進(jìn)行配對(duì)。
總結(jié):