Maison  >  Article  >  développement back-end  >  Expression régulière correspondant à l'expression IP (recommandé)

Expression régulière correspondant à l'expression IP (recommandé)

高洛峰
高洛峰original
2017-01-09 16:35:303389parcourir

Ici, je vais vous donner une explication détaillée d'une expression régulière qui correspond aux adresses IP

Les connaissances sur les expressions régulières seront mentionnées dans l'explication détaillée.

Avant de vous expliquer, permettez-moi d'abord de vous présenter les règles de génération d'adresses IP.

Une adresse IP est une chaîne de nombres binaires à 32 chiffres convertis en quatre décimales.

Comment convertir ? Expliqué ci-dessous :

Binaire : 1111111111111111111111111111111

Divisé en quatre parties : 11111111.11111111.11111111.11111111

Conversion : 2^6 2^5 2^4 2^3 2 ^2 2^1 2^0=255

Convertir en plage décimale : 0~255.0~255.0~255.0~255

Il s'agit de la plage de l'adresse IP.

En fonction des règles et de la plage de génération d'IP, nous pouvons utiliser des expressions régulières pour faire correspondre l'adresse IP, mais comment faire la correspondance ? Chacun sa méthode, je vais vous expliquer ici mon approche.

Sur la base des règles de chaîne des adresses IP, j'ai divisé l'expression correspondant aux adresses IP en deux parties à considérer.

La première partie : Match 3 0~255 (notez le point à la fin)

La deuxième partie : Match le dernier numéro 0~255

En d'autres termes , Faites d'abord correspondre la chaîne 0 ~ 255. (notez le point à la fin), puis répétez la correspondance 3 fois, puis faites correspondre la dernière partie numérique 0 ~ 255. C'est mon idée de faire correspondre les adresses IP.

Tout d'abord, je tiens à mentionner qu'il n'y a aucun moyen d'effectuer des opérations numériques avec des expressions régulières, nous ne pouvons donc pas utiliser d'opérations numériques pour filtrer la plage numérique de l'IP. Puisqu'il n'existe aucun moyen de filtrer la plage numérique d'IP à l'aide d'opérations numériques, quelles autres méthodes devrions-nous utiliser pour filtrer cette plage numérique ? Mon idée est de discuter en groupes, puis de fusionner ces groupes pour former la plage numérique des IP.

① En supposant que le numéro IP est dans le chiffre des centaines, puis en fonction de la plage de numéros IP, nous pouvons dessiner les situations suivantes. En supposant que le premier nombre est 1, alors la plage de ce nombre est 1[0-9][0-9]. Cela ne devrait pas être difficile à comprendre, donc je ne l’expliquerai pas.

② En supposant que le premier nombre soit 2, alors selon les règles de plage des numéros IP, il y a deux situations ici. Pourquoi ? Pensez-y, le nombre maximum est 255. Lorsque le chiffre des dizaines est 5, le chiffre unique ne peut être que 5 au maximum, n'est-ce pas ? Et lorsque le chiffre des dizaines est compris entre 0 et 4, le chiffre des unités peut être n’importe quel nombre, n’est-ce pas ?

Donc, les deux situations ici sont :

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

B, 25[0-5]

③.Après avoir analysé la situation des chiffres des centaines, l'étape suivante est la situation des chiffres des dizaines, alors le premier nombre devant le chiffre des dizaines ne peut pas être zéro, n'est-ce pas ?

La situation à dix chiffres peut donc être : [1-9][0-9]

④ Le reste est la situation à un chiffre, tout le monde devrait. arriver facilement à la conclusion, qui est : [0-9].

Après avoir analysé les quatre situations, nous avons abouti au regroupement de plages de numéros IP comme suit :

    1[0-9][0-9]

   2[0 - 4][0-9]

                         

                 

Comment exprimer le regroupement ci-dessus à l'aide d'expressions régulières ? C'est très simple, utilisez simplement le symbole régulier ou | et le symbole de regroupement (), donc l'expression régulière de regroupement ci-dessus est :

À ce stade, l'expression régulière de plage correspondante pour les nombres a été écrite, puis selon mes idées précédentes : La première partie : Match 3 0~255 (notez le point à la fin)

(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9])
La deuxième partie : Match le dernier chiffre 0~255

We To. correspond à la première partie de l'adresse IP, l'expression régulière est la suivante :

J'ai ajouté un point après chaque chiffre pour correspondre à 0~255 (Faites attention au point à la fin)

Alors comment répéter le match trois fois ? C'est très simple. Il suffit de traiter ces cinq groupes dans leur ensemble et de répéter la correspondance trois fois. L'expression régulière est la suivante :
(1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)

La première partie a été mise en correspondance, et l'étape suivante est la suivante. pour épisser la deuxième partie. Nombres. La partie numérique a été clairement écrite ci-dessus, donc je ne l'expliquerai pas plus. Voici l'expression régulière complète :

((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的正则表达式,为什么呢?很简单,正则表达式会对每一个分组都进行捕获匹配,上面把匹配IP分成了那么多分组,而每一个分组的内容都会被正则所捕获,那上面不知道已经捕获多少IP了,呵呵,那么怎么去掉分组的内容呢?很简单,用这个符号?:

      ?:符号放在()圆括号里面,是捕获分组,但不捕获正则表达式的内容的意思。那么,我们把它放到每一个分组里面去,不就去掉了分组的内容了吗?所以,我们还要给每个分组加上?:,加上后正则如下:

(?:(?: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地址的正则表达式是:

^(?:(?: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地址最完整的正则表达式,大家可以借鉴一下,有什么bug还望读者提出,免得误导其他读者。

    上面的正则表达式的()括号都是成对出现的,假如有不成对出现,请读者自己添加一下,可能是我漏写了。

    下面是我的测试:

<?php
$pattern = &#39;/^(?:(?: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]))$/&#39;;
//正则匹配ip地址
$ip     = &#39;254.21.0.198&#39;;
preg_match($pattern,$ip,$out);
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
print_r($out);
$ip     = &#39;255.777.0.198&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;07.25.8.198&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;1207.25.8.198&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;qq107.25.8.198&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;\.\.\.107.25.8.198&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;\.\.\.  7.25.8.198&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;107.25.8.19822vvv&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;107.25.r8.1982&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;107.225.8.19&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;225.225.225.225&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;0.0.0.0&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;00.0.0.0&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;0.202.1.0&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;0.202.1.226&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$ip     = &#39;249.202.1.0&#39;;
preg_match($pattern,$ip,$out);
print_r($out);
$s=&#39;&#39;;
for($i=0;$i<32;$i++){
  $s .= &#39;1&#39;;
}
echo $s;
echo strlen($s);

更多正则表达式匹配IP的表达式(推荐)相关文章请关注PHP中文网!


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn