加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP RegExp恢复断言以获得相反的匹配

发布时间:2020-12-13 17:07:49 所属栏目:PHP教程 来源:网络整理
导读:这是我的第一个问题所以请你好:).我正在尝试构建一个正则表达式,以获得有效的IP数组(确定,至少使用正确的IPv4格式),而不是根据RFC 1918的私有IP.到目前为止,我已经找到了一种方法完全相反,我的意思是succcssfuly匹配私有IP,所以我需要的是一种方法来恢复断言
这是我的第一个问题所以请你好:).我正在尝试构建一个正则表达式,以获得有效的IP数组(确定,至少使用正确的IPv4格式),而不是根据RFC 1918的私有IP.到目前为止,我已经找到了一种方法完全相反,我的意思是succcssfuly匹配私有IP,所以我需要的是一种方法来恢复断言.这是到目前为止的代码:

// This is an example string
$ips = '10.0.1.23,192.168.1.2,172.24.2.189,200.52.85.20,200.44.85.20';

preg_match_all('/(?:10.d{1,3}|172.(?:1[6-9]|2d|3[01])|192.168).d{1,3}.d{1,3}/',$ips,$matches);

print_r($matches);

// Prints:
Array
(
  [0] => Array
  (
    [0] => 10.0.1.23
    [1] => 192.168.1.2
    [2] => 172.24.2.189
  )
)

我想要的结果是:

Array
(
  [0] => Array
  (
    [0] => 200.52.85.20
    [1] => 200.44.85.20
  )
)

我已经尝试将表达式的第一部分(前瞻)更改为否定(?!)但这会弄乱结果,甚至不会切换结果.

如果您需要更多信息,请随时提出,非常感谢您提前.

解决方法

如果您只想排除相对较小范围的ip,那么您可以这样做
(如果我没有做任何拼写错误):

/(?!b(?:10.d{1,3}b)b(d{1,3}b)/

Perl中的示例:

use strict;
use warnings;

my @found = '10.0.1.23,200.44.85.20' =~
/
(?!
   b
   (?:
        10.d{1,3}
      |
        172.
        (?:
            1[6-9]
          | 2d
          | 3[01]
        )
      |
        192.168
   )
   .d{1,3}
   .d{1,3}
   b
)
b(d{1,3}b)
/xg;

for (@found) {
    print "$_n";
}

输出:

200.52.85.20200.44.85.20

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读