Regex匹配IP的運算式(推薦)

來源:互聯網
上載者:User
這裡給大家詳細講解一下一個匹配IP地址的Regex,

  有關正則方面的知識,會在詳細的講解中提到。

  在講解之前,我先給大家介紹一下,ip地址的建置規則。

  IP地址,是由32位元字二進位轉為四個十進位的字串組成。

  怎麼轉化?下面講解:

二進位:11111111111111111111111111111111

分為四部分:11111111.11111111.11111111.11111111

轉化:2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=255

轉為十進位範圍:0~255.0~255.0~255.0~255

這就是IP地址的範圍。

根據這個產生IP的規則和範圍,我們可以用Regex來匹配出IP地址,但怎麼匹配呢?各人有各人的方法,這裡我講解一下我的思路。

根據IP地址的字串規律,我把匹配IP地址的運算式分為兩部分來考慮。

第一部分:匹配3個0~255.(注意後面的一個點)

第二部分:匹配最後的數字0~255

也就是說,先匹配出 0~255.(注意後面的一個點) 這個字串,然後重複匹配3次,然後再匹配最後的數字部分0~255。這就是我匹配IP地址的思路。

首先,我要提一下,正則是沒有辦法做數字運算的,所以,我們無法用數字運算的方式篩選出IP的數字範圍。既然沒法用數字運算的方式篩選出IP的數字範圍,那麼我們應該用什麼其他方式來篩選這個數字範圍呢?我的思路是分組討論,然後再把這些分組合并起來組成IP的數字範圍。

①、假設IP的數字是百位元,那麼根據IP的數字範圍,我們可以得出下面幾種情況。假設第一個數字為1,那麼這個數位範圍就為1[0-9][0-9]。這個應該不難理解,就不解釋。

②、假設第一個數字為2,那麼根據IP數位範圍規則,這裡又要分為兩種情況,為什嗎?你想想,最大數字是255,當十位元為5時,個位元最大隻能為5是吧?而當十位元為0到4時,個位元可以是任一數字對吧?

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

A、2[0-4][0-9]

B、25[0-5]

③、分析完了百位元的情況,接下來就是十位元的情況了,假如是十位元,那麼十位元的前面第一個數不能為零是吧?

所以十位元的情況可以是:[1-9][0-9]

④、剩下的就是個位元的情況了,個位元的情況,大家應該很容易得出結論,就是:[0-9]。

四種情況分析下來,我們得出了IP數位範圍分組為:

        1[0-9][0-9]

        2[0-4][0-9]

        25[0-5]

        [1-9][0-9]

        [0-9]

怎麼把上面的分組用Regex表示出來呢?很簡單,用正則的或符號|和分組符號()就可以了,所以上面的分組Regex為:

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

寫到這裡,數位匹配範圍Regex已經寫好了,那麼根據我前面的思路: 第一部分:匹配3個0~255.(注意後面的一個點)

第二部分:匹配最後的數字0~255

我們來匹配IP地址的第一部分,Regex如下: 

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

   我在每個數位後面加了一個點就是匹配出0~255.(注意後面的一個點)

那麼怎麼重複匹配三次呢?很簡單,我們只要把這五個分組當成整體,再重複匹配三次就行了,Regex如下: 

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

第一部分已經匹配出來了,接下來就是拼接上第二部分的數字了,數字部分上面已經寫得很清楚了,就不再解釋了,下面是完整的Regex:

((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的運算式已經出來了,不過,這並不是最終的匹配IP的Regex,為什麼呢?很簡單,Regex會對每一個分組都進行捕獲匹配,上面把匹配IP分成了那麼多分組,而每一個分組的內容都會被正則所捕獲,那上面不知道已經捕獲多少IP了,呵呵,那麼怎麼去掉分組的內容呢?很簡單,用這個符號?:

   ?:符號放在()圓括弧裡面,是捕獲分組,但不捕獲Regex的內容的意思。那麼,我們把它放到每一個分組裡面去,不就去掉了分組的內容了嗎?所以,我們還要給每個分組加上?:,加上後正則如下:

(?:(?: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地址匹配出來,我們還要用^和$來限制字串的開頭和結尾,所以,最後的匹配IP地址的Regex是:

^(?:(?: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地址最完整的Regex,大家可以借鑒一下,有什麼bug還望讀者提出,免得誤導其他讀者。

    上面的Regex的()括弧都是成對出現的,假如有不成對出現,請讀者自己添加一下,可能是我漏寫了。

    下面是我的測試:

<?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);
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.