如何通过正则表达式解析nslookup结果

时间:2018-10-23 10:17:53

标签: php regex

我有2个不同的nslookup结果:

Server:  PROXY.LOCAL
Address:  192.168.1.1

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

Server:  router.local
Address:  192.168.1.1

DNS request timed out.
    timeout was 3 seconds.
Name:    google.com
Address:  216.58.207.46

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

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

问题是,当Addresses:存在时,它将仅返回第一个IP,而不返回新行中的第二个IP。

1 个答案:

答案 0 :(得分:2)

您的方法的主要问题是您以(?:Name:\s*\S+\s*)\K模式“固定”了比赛。 \K运算符不会使前面的模式不费时,并且必须显示该文本才能进行匹配。

您应确保模式遵循类似方案:

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

也就是说,您当前的模式遵循abc\s+(?:\G(?!\A)|d)\s*\K\S+方案,应该为(?:\G(?!\A)|abc\s+d)\s*\K\S+

您可以使用

对其进行修复
'~(?:\G(?!\A)\R\h+|^Name:\s*\S+\s*Address(?:es)?:)\s*\K\S+~m'

请参见regex demo

它匹配

  • (?:\G(?!\A)\R\h+|^Name:\s*\S+\s*Address(?:es)?:)-上一场比赛(\G(?!\A))的结尾+换行符和1+个水平空白字符(\h+)或(|)一个序列以下模式之一:
    • ^-一行的开头
    • Name:-文字子字符串
    • \s*-超过0个空格
    • \S+-1个以上非空格字符
    • \s*-超过0个空格
    • Address-文字子字符串
    • (?:es)?-匹配es子字符串1或0次的可选非捕获组
    • :-冒号
  • \s*-超过0个空格
  • \K-匹配重置运算符(丢弃到目前为止所有匹配的文本)
  • \S+-1个以上非空格字符。

请注意,我在\h+之后添加了\G(?!\A),以确保下一行以1+个水平空格开头,以便在下一行以非空白字符开头时停止匹配。