Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何通过regex解析nslookup结果_Php_Regex - Fatal编程技术网

Php 如何通过regex解析nslookup结果

Php 如何通过regex解析nslookup结果,php,regex,Php,Regex,我有两个不同的nslookup结果: Server: PROXY.LOCAL Address: 192.168.1.1 Name: google.com Addresses: 2a02:598:2::1168 77.75.77.168 及 我的正则表达式代码如下所示: $re = '~(?:Name:\s*\S+\s*)\K(?:\G(?!\A)|^Addresses:|^Address:)\s*\K\S\S\S+~m'; 问题是当地址:存在时,它将只返回第一个IP,

我有两个不同的nslookup结果:

Server:  PROXY.LOCAL
Address:  192.168.1.1

Name:    google.com
Addresses:  2a02:598:2::1168
     77.75.77.168

我的正则表达式代码如下所示:

$re = '~(?:Name:\s*\S+\s*)\K(?:\G(?!\A)|^Addresses:|^Address:)\s*\K\S\S\S+~m';

问题是当
地址:
存在时,它将只返回第一个IP,而不是新行上的第二个。

您的方法的主要问题是您将匹配“锚定”在
(?:Name:\s*\s+\s*)\K
模式。
\K
运算符不会使前面的模式不使用,必须显示该文本才能进行匹配

您应确保图案符合以下方案:

(?:\G(?!\A)|<START_PATTERN>)<PATTERN_TO_CONSUME_AND_OMIT>\K<PATTERN_TO_EXTRACT>

相配

  • (?:\G(?!\A)\R\h+^Name:\s*\s+\s*地址(?:es)?:)
    -上一个匹配的结尾(
    \G(?!\A)
    )+换行符和1+水平空白字符(
    \h+
    )或(
    )以下模式的序列:
    • ^
      -行的开头
    • 名称:
      -文字子字符串
    • \s*
      -0+空格
    • \S+
      -1+非空白字符
    • \s*
      -0+空格
    • 地址
      -文字子字符串
    • (?:es)?
      -可选的非捕获组匹配
      es
      子字符串1或0次
    • -冒号
  • \s*
    -0+空格
  • \K
    -匹配重置运算符(放弃所有到目前为止匹配的文本)
  • \S+
    -1+非空白字符
注意:我在
\G(?!\A)
之后添加了
\h+
,以确保下一行以1+水平空格开头,以便在下一行以非空格字符开头时停止匹配

(?:\G(?!\A)|<START_PATTERN>)<PATTERN_TO_CONSUME_AND_OMIT>\K<PATTERN_TO_EXTRACT>
'~(?:\G(?!\A)\R\h+|^Name:\s*\S+\s*Address(?:es)?:)\s*\K\S+~m'