日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

详解一个自己原创的正则匹配IP的表达式

發(fā)布時(shí)間:2024/7/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解一个自己原创的正则匹配IP的表达式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

 

第一種方法(可以匹配有點(diǎn)毛病):檢測(cè)IP地址的正則表達(dá)式

正則表達(dá)式:

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

?

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

紅色塊代表:第一個(gè)字符是2,第二個(gè)字符是0到4,第三個(gè)字符是任意一位數(shù)字。表示200~249。

綠色塊代表:第一個(gè)字符是2,第二個(gè)字符是5,第三個(gè)字符是0到5。表示250~255。

藍(lán)色塊代表:第一個(gè)字符是0,或者1,或者可以沒有這個(gè)字符,第二個(gè)字符是任意一位數(shù)字,第三個(gè)字符是任意一位數(shù)字,可以沒有這個(gè)字符。表示1~199,可以有前導(dǎo)零。

“|”代表“或者”的意思,只要滿足三塊中的任意一塊的意思。

前后的“(”和“)”代表這是一組

?

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

{3}代表重復(fù)三次。比如“255.255.255.”。

?

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

最后這一組的意思同上,就是在“.”后面加上相同的檢測(cè)。

第二種方法:

IP地址,是由32位數(shù)字二進(jìn)制轉(zhuǎn)為四個(gè)十進(jìn)制的字符串組成。

  怎么轉(zhuǎn)化?下面講解:

? ? ??二進(jìn)制:11111111111111111111111111111111

? ? ??分為四部分:11111111.11111111.11111111.11111111

? ? ??轉(zhuǎn)化:2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=255

? ? ??轉(zhuǎn)為十進(jìn)制范圍:0~255.0~255.0~255.0~255

? ? ??這就是IP地址的范圍。

? ? ??根據(jù)這個(gè)生成IP的規(guī)則和范圍,我們可以用正則表達(dá)式來匹配出IP地址,但怎么匹配呢?各人有各人的方法,這里我講解一下我的思路。

? ? ??根據(jù)IP地址的字符串規(guī)律,我把匹配IP地址的表達(dá)式分為兩部分來考慮。

? ? ??第一部分:匹配3個(gè)0~255.(注意后面的一個(gè)點(diǎn))

? ? ??第二部分:匹配最后的數(shù)字0~255

? ? ??也就是說,先匹配出?0~255.(注意后面的一個(gè)點(diǎn)) 這個(gè)字符串,然后重復(fù)匹配3次,然后再匹配最后的數(shù)字部分0~255。這就是我匹配IP地址的思路。

? ? ? ?首先,我要提一下,正則是沒有辦法做數(shù)字運(yùn)算的,所以,我們無(wú)法用數(shù)字運(yùn)算的方式篩選出IP的數(shù)字范圍。既然沒法用數(shù)字運(yùn)算的方式篩選出IP的數(shù)字范圍,那么我們應(yīng)該用什么其他方式來篩選這個(gè)數(shù)字范圍呢?我的思路是分組討論,然后再把這些分組合并起來組成IP的數(shù)字范圍。

? ? ? ?①、假設(shè)IP的數(shù)字是百位數(shù),那么根據(jù)IP的數(shù)字范圍,我們可以得出下面幾種情況。假設(shè)第一個(gè)數(shù)字為1,那么這個(gè)數(shù)字的范圍就為1[0-9][0-9]。這個(gè)應(yīng)該不難理解,就不解釋。

? ? ? ②、假設(shè)第一個(gè)數(shù)字為2,那么根據(jù)IP數(shù)字的范圍規(guī)則,這里又要分為兩種情況,為什么?你想想,最大數(shù)字是255,當(dāng)十位數(shù)為5時(shí),個(gè)位數(shù)最大只能為5是吧?而當(dāng)十位數(shù)為04時(shí),個(gè)位數(shù)可以是任意數(shù)字對(duì)吧?

? ? ??所以,這里的兩種情況分別為:

? ? ? ? ? ?A2[0-4][0-9]

? ? ? ? ? ?B25[0-5]

? ? ? ?③、分析完了百位數(shù)的情況,接下來就是十位數(shù)的情況了,假如是十位數(shù),那么十位數(shù)的前面第一個(gè)數(shù)不能為零是吧?

所以十位數(shù)的情況可以是:[1-9][0-9]

? ? ? ?④、剩下的就是個(gè)位數(shù)的情況了,個(gè)位數(shù)的情況,大家應(yīng)該很容易得出結(jié)論,就是:[0-9]

? ? ? ?四種情況分析下來,我們得出了IP數(shù)字的范圍分組為:

        1[0-9][0-9]

        2[0-4][0-9]

        25[0-5]

        [1-9][0-9]

        [0-9]

? ? ? ?怎么把上面的分組用正則表達(dá)式表示出來呢?很簡(jiǎn)單,用正則的或符號(hào)|和分組符號(hào)()就可以了,所以上面的分組正則表達(dá)式為:

???       (1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])

? ? ? ??寫到這里,數(shù)字的匹配范圍正則表達(dá)式已經(jīng)寫好了,那么根據(jù)我前面的思路:?第一部分:匹配3個(gè)0~255.(注意后面的一個(gè)點(diǎn))

? ? ? ? ?第二部分:匹配最后的數(shù)字0~255

? ? ? ??我們來匹配IP地址的第一部分,正則表達(dá)式如下:

??      ?(1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)

   我在每個(gè)數(shù)字的后面加了一個(gè)點(diǎn)就是匹配出0~255.(注意后面的一個(gè)點(diǎn))

? ? ? ? ?那么怎么重復(fù)匹配三次呢?很簡(jiǎn)單,我們只要把這五個(gè)分組當(dāng)成整體,再重復(fù)匹配三次就行了,正則表達(dá)式如下:

      ((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9])\.)){3}

? ? ? ? ?第一部分已經(jīng)匹配出來了,接下來就是拼接上第二部分的數(shù)字了,數(shù)字部分上面已經(jīng)寫得很清楚了,就不再解釋了,下面是完整的正則表達(dá)式:

((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))

???  ?寫到這里,正則匹配IP的表達(dá)式已經(jīng)出來了,不過,這并不是最終的匹配IP的正則表達(dá)式,為什么呢?很簡(jiǎn)單,正則表達(dá)式會(huì)對(duì)每一個(gè)分組都進(jìn)行捕獲匹配,上面把匹配IP分成了那么多分組,而每一個(gè)分組的內(nèi)容都會(huì)被正則所捕獲,那上面不知道已經(jīng)捕獲多少IP了,呵呵,那么怎么去掉分組的內(nèi)容呢?很簡(jiǎn)單,用這個(gè)符號(hào)?:

   ? ??:符號(hào)放在()圓括號(hào)里面,是捕獲分組,但不捕獲正則表達(dá)式的內(nèi)容的意思。那么,我們把它放到每一個(gè)分組里面去,不就去掉了分組的內(nèi)容了嗎?所以,我們還要給每個(gè)分組加上?:,加上后正則如下:

(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))

   ?即使到這里,還是沒有把IP地址匹配出來,我們還要用^$來限制字符串的開頭和結(jié)尾,所以,最后的匹配IP地址的正則表達(dá)式是:

^(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))$

   ?這就是我匹配IP地址最完整的正則表達(dá)式,大家可以借鑒一下,有什么bug還望讀者提出,免得誤導(dǎo)其他讀者。

    上面的正則表達(dá)式的()括號(hào)都是成對(duì)出現(xiàn)的,假如有不成對(duì)出現(xiàn),請(qǐng)讀者自己添加一下,可能是我漏寫了。

    下面是我的測(cè)試:

<?php $pattern = '/^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:2[0-5][0-5])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))$/'; //正則匹配ip地址 $ip = '254.21.0.198'; preg_match($pattern,$ip,$out); echo '<pre>'; print_r($out); $ip = '255.777.0.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '07.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '1207.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = 'qq107.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '\.\.\.107.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '\.\.\. 7.25.8.198'; preg_match($pattern,$ip,$out); print_r($out); $ip = '107.25.8.19822vvv'; preg_match($pattern,$ip,$out); print_r($out); $ip = '107.25.r8.1982'; preg_match($pattern,$ip,$out); print_r($out); $ip = '107.225.8.19'; preg_match($pattern,$ip,$out); print_r($out); $ip = '225.225.225.225'; preg_match($pattern,$ip,$out); print_r($out); $ip = '0.0.0.0'; preg_match($pattern,$ip,$out); print_r($out); $ip = '00.0.0.0'; preg_match($pattern,$ip,$out); print_r($out); $ip = '0.202.1.0'; preg_match($pattern,$ip,$out); print_r($out); $ip = '0.202.1.226'; preg_match($pattern,$ip,$out); print_r($out); $ip = '249.202.1.0'; preg_match($pattern,$ip,$out); print_r($out); $s=''; for($i=0;$i<32;$i++){$s .= '1'; } echo $s; echo strlen($s);

總結(jié)

以上是生活随笔為你收集整理的详解一个自己原创的正则匹配IP的表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。