PHP preg_split字符串中的IP

时间:2011-02-21 19:27:47

标签: php arrays ip preg-split

我试图在PHP中使用preg_split来分解以下字符串并返回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

在我的浏览器中。

2 个答案:

答案 0 :(得分: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/>";

答案 1 :(得分:0)

如果使用现有的正则表达式进行拆分,则匹配的部分肯定不会成为结果列表的一部分。相反,你会得到空的空间,并填补其中的东西。

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

preg_match_all('/\d+\.\d+\.\d+\.\d+/', $str, $matches);
$list = $matches[0];