2

我正在尝试preg_split在 PHP 中使用来分解以下字符串并返回 2 个 IP 地址:

$membersStr = "members { 167.69.27.151:4449 {} 167.69.27.153:4449 {} 167.69.27.154:4449 { session user disabled } 167.67.27.156:4449 }";

我的代码是:

$nodesArray = preg_split("/\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/", $membersStr, -1, PREG_SPLIT_NO_EMPTY);

然后现在简单地打印它:

print_r($nodesArray);

但是它是一个空数组。我从在线检查器中仔细检查了我的正则表达式,它返回了 IP。

试 :

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $membersStr, $nodesArray);
echo $nodesArray[0];

印刷:

Array

在我的浏览器中。

4

2 回答 2

2

您在这里不需要那种复杂的正则表达式。使用此正则表达式提取第一组括号内的 IP:

members \{(.*)\}

取第一组(括号之间的内容)。然后上去explode()获取{}每个IP。遍历每个值,修剪它,并确保它不是空白的。

编辑

尝试这个:

$membersStr = "members { 167.69.27.151:4449 {} 167.69.27.153:4449 {} }";

$ips = explode("{", $membersStr, 2);
$ips = explode("{}", $ips[1]);

foreach ($ips as $ip){
    $ip = trim($ip);
    if ($ip != "" && $ip != "}")
        echo $ip . "<br/>";
}

从文件中提取的样本

 members {
      167.69.97.48:4440 {
         session user disabled
      }
      167.69.97.91:4440 {}
   }

编辑

使用其他答案,但像这样:

$membersStr = @" members {
      167.69.97.48:4440 {
         session user disabled
      }
      167.69.97.91:4440 {}
   }";

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $membersStr, $nodesArray);

foreach ($nodesArray[0] as $ip)
    echo $ip . "<br/>";
于 2011-02-21T19:34:53.707 回答
0

如果您使用现有的正则表达式进行拆分,那么匹配的部分肯定不会成为结果列表的一部分。相反,您将获得空白空间并在两者之间填充东西。

因此,如果您匹配并提取您真正想要的部分,它会更简单:

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $str, $matches);
$list = $matches[0];
于 2011-02-21T19:42:33.533 回答